Enrichment x stress MA

Supplementary Material

Setting-up

Loading packages

#devtools::install_github('Mikata-Project/ggthemr', force = TRUE) 

pacman::p_load(tidyverse, 
               here,
               metafor,
               clubSandwich,
               orchaRd, 
               MuMIn, 
               patchwork,
               GoodmanKruskal,
               networkD3,
               ggplot2,
               visdat,
               ggalluvial,
               ggthemr, 
               cowplot,
               grDevices,
               png,
               grid,
               gridGraphics)
# needed for model selection using MuMIn within metafor
eval(metafor:::.MuMIn)

Loading data and functions

dat <- read_csv(here("Data","Data_raw.csv"))
# Load custom function to extract data 
source(here("R/Functions.R")) 

Data organisation

Removing study with negative values, rounding down sample sizes,getting effect sizes from function, ‘flipping’ effect sizes so that all effect sizes are higher values = individuals do better and learning/memory, assigning human readable terms, and creating VCV of variance

# removing study with negative values as these are unable to be used for lnRR
dat <- droplevels(dat[!dat$First_author == 'Wang',])

#rounding down sample sizes
dat$CC_n <- floor(dat$CC_n)
dat$EC_n <- floor(dat$EC_n)
dat$CS_n <- floor(dat$CS_n)
dat$ES_n <- floor(dat$CS_n)

# 'Focal' effect_size 
effect_size <- with(dat, mapply(effect_set, 
                      CC_n ,
                      CC_mean, 
                      CC_SD,
                      EC_n, 
                      EC_mean, 
                      EC_SD,
                      CS_n, 
                      CS_mean, 
                      CS_SD,
                      ES_n, 
                      ES_mean, 
                      ES_SD,
                      percent = Response_percent,
                      SIMPLIFY = FALSE))
effect_size <- map_dfr(effect_size, I)

# 'Pairwise' effect size
 effect_size2 <- with(dat, mapply(effect_set2, 
                      CC_n ,
                      CC_mean, 
                      CC_SD,
                      EC_n, 
                      EC_mean, 
                      EC_SD,
                      CS_n, 
                      CS_mean, 
                      CS_SD,
                      ES_n, 
                      ES_mean, 
                      ES_SD,
                      percent = Response_percent,
                      SIMPLIFY = FALSE))
effect_size2 <- map_dfr(effect_size2, I)

full_info <- which(complete.cases(effect_size) == TRUE)

# adding effect sizes as column
dat <- bind_cols(dat, effect_size, effect_size2)
dat <- dat[full_info, ]

#Flipping 'lower is better' effect sizes
#flipping lnRR for values where higher = worse
dat$lnRR_Ea <- ifelse(dat$Response_direction == 2, dat$lnRR_E*-1,ifelse(is.na(dat$Response_direction) == TRUE, NA, dat$lnRR_E))
# currently NAswhich causes error
dat$lnRR_Sa  <- ifelse(dat$Response_direction == 2, dat$lnRR_S*-1,ifelse(is.na(dat$Response_direction) == TRUE, NA, dat$lnRR_S)) # currently NAswhich causes error
dat$lnRR_ESa <-  ifelse(dat$Response_direction == 2, dat$lnRR_ES*-1,ifelse(is.na(dat$Response_direction) == TRUE, NA, dat$lnRR_ES)) # currently NAswhich causes error
#flipping 'pure effect sizes'
dat$lnRR_E2a <- ifelse(dat$Response_direction == 2, dat$lnRR_E2*-1,ifelse(is.na(dat$Response_direction) == TRUE, NA, dat$lnRR_E2)) # currently NAswhich causes error
dat$lnRR_S2a  <- ifelse(dat$Response_direction == 2, dat$lnRR_S2*-1,ifelse(is.na(dat$Response_direction) == TRUE, NA, dat$lnRR_S2)) # currently NAswhich causes error
dat$lnRR_ES2a <-  ifelse(dat$Response_direction == 2, dat$lnRR_ES2*-1,ifelse(is.na(dat$Response_direction) == TRUE, NA, dat$lnRR_ES2)) # currently NAswhich causes error
dat$lnRR_E3a <-  ifelse(dat$Response_direction == 2, dat$lnRR_E3*-1,ifelse(is.na(dat$Response_direction) == TRUE, NA, dat$lnRR_E3)) # currently NAswhich causes error
dat$lnRR_S3a <-  ifelse(dat$Response_direction == 2, dat$lnRR_S3*-1,ifelse(is.na(dat$Response_direction) == TRUE, NA, dat$lnRR_S3)) # currently NAswhich causes error

#flipping SMD
dat$SMD_Ea <- ifelse(dat$Response_direction == 2, dat$SMD_E*-1,ifelse(is.na(dat$Response_direction) == TRUE, NA, dat$SMD_E)) # currently NAswhich causes error
dat$SMD_Sa  <- ifelse(dat$Response_direction == 2, dat$SMD_S*-1,ifelse(is.na(dat$Response_direction) == TRUE, NA, dat$SMD_S)) # currently NAswhich causes error
dat$SMD_ESa <-  ifelse(dat$Response_direction == 2, dat$SMD_ES*-1,ifelse(is.na(dat$Response_direction) == TRUE, NA, dat$SMD_ES))

# assigning human readable terms
dat <- dat %>% mutate(Type_assay = case_when(Type_assay == 1 ~ "Habituation",
                                                Type_assay == 2 ~ "Conditioning",
                                                Type_assay == 3 ~ "Recognition", 
                                                Type_assay == 4 ~ "Unclear"),
                      Learning_vs_memory = case_when(Learning_vs_memory == 1 ~ "Learning",
                                                     Learning_vs_memory == 2 ~ "Memory", 
                                                     Learning_vs_memory == 3 ~ "Habituation"),
                      Type_reinforcement = case_when(Type_reinforcement== 1 ~"Appetitive",
                                                         Type_reinforcement== 2 ~ "Aversive",
                                                         Type_reinforcement== 3 ~ "Not applicable",
                                                         Type_reinforcement== 4 ~ "Unclear"),
                      Type_stress_exposure = case_when(Type_stress_exposure == 1 ~ "Density",
                                                       Type_stress_exposure == 2 ~ "Scent",
                                                       Type_stress_exposure == 3 ~ "Shock",
                                                       Type_stress_exposure == 4 ~ "Exertion",
                                                       Type_stress_exposure == 5 ~ "Restraint",
                                                       Type_stress_exposure == 6 ~ "MS",
                                                       Type_stress_exposure == 7 ~ "Circadian rhythm",
                                                       Type_stress_exposure == 8 ~ "Noise",
                                                       Type_stress_exposure == 9 ~ "Other",
                                                       Type_stress_exposure == 10 ~ "Combination",
                                                       Type_stress_exposure == 11 ~ "unclear"), 
                      Age_stress_exposure = case_when(Age_stress_exposure == 1 ~ "Prenatal",
                                                      Age_stress_exposure == 2 ~ "Early postnatal",
                                                      Age_stress_exposure == 3 ~ "Adolescent",
                                                      Age_stress_exposure == 4 ~ "Adult",
                                                      Age_stress_exposure == 5 ~ "Unclear"),
                      Stress_duration = case_when(Stress_duration == 1 ~ "Acute",
                                                  Stress_duration == 2 ~ "Chronic",
                                                  Stress_duration == 3 ~ "Intermittent",
                                                  Stress_duration == 4 ~ "Unclear"),
                      EE_social = case_when(EE_social == 1 ~ "Social",
                                            EE_social== 2 ~ "Non-social", 
                                            EE_social == 3 ~ "Unclear"), 
                      EE_exercise = case_when(EE_exercise == 1 ~ "Exercise", 
                                              EE_exercise == 2 ~ "No exercise"),
                      Age_EE_exposure = case_when(Age_EE_exposure == 1 ~ "Prenatal", 
                                                  Age_EE_exposure == 2 ~ "Early postnatal",
                                                  Age_EE_exposure == 3 ~ "Adolescent", 
                                                  Age_EE_exposure == 4 ~ "Adult",
                                                  Age_EE_exposure == 5 ~ "Unclear"),
                      Exposure_order = case_when(Exposure_order == 1 ~ "Stress first",
                                                      Exposure_order == 2 ~ "Enrichment first",
                                                      Exposure_order == 3 ~ "Concurrently", 
                                                      Exposure_order == 4 ~ "Unclear"),
                      Age_assay = case_when(Age_assay == 1 ~ "Early postnatal",
                                            Age_assay == 2 ~ "Adolescent",
                                            Age_assay == 3 ~ "Adult", 
                                            Age_assay == 4 ~ "Unclear"),
                      Sex = case_when(Sex == 1 ~ "Female", 
                                      Sex == 2 ~ "Male", 
                                      Sex == 3 ~ "Mixed", 
                                      Sex == 4 ~ "Unclear"),
                      Type_EE_exposure = case_when(Type_EE_exposure == 1 ~ "Nesting material",
                                                      Type_EE_exposure == 2 ~ "Objects",
                                                      Type_EE_exposure == 3 ~ "Cage complexity", 
                                                      Type_EE_exposure == 4 ~ "Wheel/trademill",
                                                      Type_EE_exposure == 5 ~ "Combination",
                                                      Type_EE_exposure == 6 ~ "Other", 
                                                      Type_EE_exposure == 7 ~ "Unclear"),
                      ROB_blinding = case_when(ROB_blinding == 1 ~ "Yes",
                                               ROB_blinding == 2 ~ "No",
                                               ROB_blinding == 3 ~ "Unclear"),
                      ROB_randomisation = case_when(ROB_randomisation == 1 ~ "Yes",
                                                    ROB_randomisation == 2 ~ "No",
                                                    ROB_randomisation == 3 ~ "Unclear"))

#making variance VCVs
VCV_E <- impute_covariance_matrix(vi = dat$lnRRV_E, cluster = dat$Study_ID, r = 0.5)
VCV_S <- impute_covariance_matrix(vi = dat$lnRRV_S, cluster = dat$Study_ID, r = 0.5)
VCV_ES <- impute_covariance_matrix(vi = dat$lnRRV_ES, cluster = dat$Study_ID, r = 0.5)

VCV_Ea <- impute_covariance_matrix(vi = dat$SMDV_E, cluster = dat$Study_ID, r = 0.5)
VCV_Sa <- impute_covariance_matrix(vi = dat$SMDV_S, cluster = dat$Study_ID, r = 0.5)
VCV_ESa <- impute_covariance_matrix(vi = dat$SMDV_ES, cluster = dat$Study_ID, r = 0.5)

#write.csv(dat, file = here("Data", 'Data_processed.csv'), row.names = TRUE)

Data exploration

General

#Number of effect sizes
length(unique(dat$ES_ID))  

#Number of studies
length(unique(dat$Study_ID))

#Publication years
min(dat$Year_published) 
max(dat$Year_published)

Explore associations among predictor variables

plot_missing <- vis_miss(dat) +
  theme(plot.title = element_text(hjust = 0.5, vjust = 3), 
        plot.margin = margin(t = 0.5, r = 3, b = 1, l = 1, unit = "cm")) +
  ggtitle("Missing data in the selected predictors") #no missing values

plot_missing

#useGoodman and Kruskal’s τ measure of association between categorical predictor variables (function from package GoodmanKruskal: https://cran.r-project.org/web/packages/GoodmanKruskal/vignettes/GoodmanKruskal.html)
#GKmatrix <- GKtauDataframe(subset(dat, select = c("Sex", "Type_assay", "Learning_vs_memory", #"Type_reinforcement",  "Type_stress_exposure", "Age_stress_exposure", "Stress_duration", #"EE_social_HR", "EE_exercise", "Age_EE_exposure", "Exposure_order", "Age_assay")))
#plot(GKmatrix)

#simple pairwise contingency tables
# table(dat$Type_assay, dat$Type_reinforcement) 
# table(dat$Age_stress_exposure, dat$Age_EE_exposure) 
# table(dat$Type_stress_exposure, dat$Age_stress_exposure)
# table(dat$Type_stress_exposure, dat$Age_assay)
# table(dat$Type_stress_exposure, dat$Stress_duration)

Alluvial diagrams

Subjects info: species-strain-sex

freq_A <- as.data.frame(table(dat$Sex, dat$Common_species, dat$Strain)) %>% rename(Sex = Var1, Species = Var2, Strain = Var3) #make a data frame of frequencies for three selected variables
is_alluvia_form(as.data.frame(freq_A), axes = 1:3, silent = TRUE)

p1 <- ggplot(data = freq_A,
  aes(axis1 = Sex, axis2 = Species, axis3 = Strain, y = Freq)) +
  geom_alluvium(aes(fill = Sex)) +
  geom_flow() +
  geom_stratum(aes(fill = Sex)) +
  geom_text(stat = "stratum", aes(label = after_stat(stratum))) +
  #theme_minimal() +
  theme_void() +
  theme(legend.position = "none",
        plot.title = element_text(hjust = 0, vjust = 3),
        axis.title.x = element_text(),
        axis.text.x = element_text(face="bold"),
        plot.margin = unit(c(1, 1, 0, 1), "cm")) +
  scale_x_discrete(limits = c("Sex", "Species", "Strain"), expand = c(0.15, 0.05), position = "top") +
  ggtitle("A  study subjects")

p1

EE info: type-exercise-social EE

#TODO change enrichment type to age

freq_B <- as.data.frame(table(dat$Age_EE_exposure, dat$EE_exercise, dat$EE_social)) %>% rename(Age_EE_exposure = Var1, EE_exercise = Var2, EE_social = Var3) #make a data frame of frequencies for three selected variables
is_alluvia_form(as.data.frame(freq_B), axes = 1:3, silent = TRUE)

p2 <- ggplot(data = freq_B,
  aes(axis1 = Age_EE_exposure, axis2 = EE_exercise, axis3 = EE_social, y = Freq)) +
  geom_alluvium(aes(fill = Age_EE_exposure)) +
  geom_flow() +
  geom_stratum(aes(fill = Age_EE_exposure)) +
  geom_text(stat = "stratum", aes(label = after_stat(stratum))) +
  #theme_minimal() +
  theme_void() +
  theme(legend.position = "none",
        plot.title = element_text(hjust = 0, vjust = 3),
        axis.title.x = element_text(),
        axis.text.x = element_text(face="bold"),
        plot.margin = unit(c(1, 1, 0, 1), "cm")) +
  scale_x_discrete(limits = c("Age", "Exercise", "Social"), expand = c(0.1, 0.1), position = "top") +
  ggtitle("C  environmental enrichment")

p2

Stress info: age-duration-type stress

freq_C <- as.data.frame(table(dat$Age_stress_exposure, dat$Stress_duration, dat$Type_stress_exposure)) %>% rename(Age_stress = Var1, Duration_stress = Var2, Type_stress = Var3) #make a data frame of frequencies for three selected variables
is_alluvia_form(as.data.frame(freq_C), axes = 1:3, silent = TRUE)

p3 <- ggplot(data = freq_C,
  aes(axis1 = Age_stress, axis2 = Duration_stress, axis3 = Type_stress, y = Freq)) +
  geom_alluvium(aes(fill = Age_stress)) +
  geom_flow() +
  geom_stratum(aes(fill = Age_stress)) +
  geom_text(stat = "stratum", aes(label = after_stat(stratum))) +
  #theme_minimal() +
  theme_void() +
  theme(legend.position = "none",
        plot.title = element_text(hjust = 0, vjust = 3),
        axis.title.x = element_text(),
        axis.text.x = element_text(face="bold"),
        plot.margin = unit(c(1, 1, 0, 1), "cm")) +
  scale_x_discrete(limits = c("Age", "Duration", "Type"), expand = c(0.1, 0.1), position = "top") +
  ggtitle("B  stress exposure")

p3

Assay info: L/M-type-reinforcement

freq_D <- as.data.frame(table(dat$Learning_vs_memory, dat$Type_assay, dat$Type_reinforcement)) %>% rename(Learning_Memory = Var1, Type = Var2, Reinforcement = Var3) #make a data frame of frequencies for three selected variables
is_alluvia_form(as.data.frame(freq_D), axes = 1:3, silent = TRUE)

p4 <- ggplot(data = freq_D,
  aes(axis1 = Learning_Memory, axis2 = Type, axis3 = Reinforcement, y = Freq)) +
  geom_alluvium(aes(fill = Learning_Memory)) +
  geom_flow() +
  geom_stratum(aes(fill = Learning_Memory)) +
  geom_text(stat = "stratum", aes(label = after_stat(stratum))) +
  #theme_minimal() +
  theme_void() +
  theme(legend.position = "none",
        plot.title = element_text(hjust = 0, vjust = 3),
        axis.title.x = element_text(),
        axis.text.x = element_text(face="bold"),
        plot.margin = unit(c(1, 1, 0, 1), "cm")) +
  scale_x_discrete(limits = c("Learning_Memory", "Type", "Reinforcement"), expand = c(0.1, 0.1), position = "top") +
  ggtitle("D  cognitive assay")

p4

Combined plot

#p1 + scale_fill_brewer(palette = "Set3") #Pastel1

(p1 + scale_fill_brewer(palette = "Set3")) / (p2 + scale_fill_brewer(palette = "Set3")) / (p3 + scale_fill_brewer(palette = "Set3")) / (p4 + scale_fill_brewer(palette = "Set3")) + plot_layout(ncol = 1, heights = c(1,1,1,1,1))

#ggsave(file = "./figs/Alluvial_diagrams_v2.pdf", width = 10, height = 12, units = "cm", dpi = 300, scale = 2) #, device = cairo_pdf)

Modelling with lnRR

Environmental enrichment

Meta-analysis

#dat <- read_csv(here("Data","Data_processed.csv"))

mod_E0 <- rma.mv(yi = lnRR_Ea, V = VCV_E, random = list(~1|Study_ID,
                                                          ~1|ES_ID,
                                                          ~1|Strain),
                 test = "t",
                 data = dat)
summary(mod_E0) 
## 
## Multivariate Meta-Analysis Model (k = 92; method: REML)
## 
##   logLik  Deviance       AIC       BIC      AICc 
##  -9.7836   19.5672   27.5672   37.6106   28.0323   
## 
## Variance Components:
## 
##             estim    sqrt  nlvls  fixed    factor 
## sigma^2.1  0.0082  0.0905     30     no  Study_ID 
## sigma^2.2  0.0345  0.1858     92     no     ES_ID 
## sigma^2.3  0.0000  0.0000      6     no    Strain 
## 
## Test for Heterogeneity:
## Q(df = 91) = 809.2712, p-val < .0001
## 
## Model Results:
## 
## estimate      se    tval  df    pval   ci.lb   ci.ub 
##   0.1860  0.0320  5.8116  91  <.0001  0.1224  0.2496  *** 
## 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
i2_ml(mod_E0) 
##     I2_total  I2_Study_ID     I2_ES_ID    I2_Strain 
## 9.310673e-01 1.786605e-01 7.524068e-01 6.097041e-10
orchard_plot(mod_E0, mod = "Int", xlab = "lnRR", alpha=0.4) +  # Orchard plot 
  geom_errorbarh(aes(xmin = lowerPR, xmax = upperPR), height = 0, show.legend = FALSE, size = 1.1, alpha = 0.5)+ # prediction intervals
  geom_errorbarh(aes(xmin = lowerCL, xmax = upperCL), height = 0.05, show.legend = FALSE, size = 2)+ # confidence intervals
  geom_point(aes(fill = name),  size = 5, shape = 21)+ # mean estimate
  scale_colour_manual(values = "darkorange")+ # change colours
  scale_fill_manual(values="darkorange")+ 
  scale_size_continuous(range = c(1, 7))+ # change point scaling
  theme(panel.border = element_rect(colour = "black", fill=NA, size=1.3), # border around the plot
        text = element_text(size = 24), # change font sizes
        legend.title = element_text(size = 15),
        legend.text = element_text(size = 13)) 

Meta-regression: uni-moderator

Type of assay

dat1 <- filter(dat, Type_assay %in% c("Recognition", "Habituation", "Conditioning"))
VCV_E1 <- impute_covariance_matrix(vi = dat1$lnRRV_E, cluster = dat$Study_ID, r = 0.5)

mod_E1 <- rma.mv(yi = lnRR_Ea, V = VCV_E1, mod = ~Type_assay-1, random = list(~1|Study_ID,
                                                                                  ~1|ES_ID,
                                                                                  ~1|Strain),
                 test = "t",
                 data = dat1)

summary(mod_E1)
## 
## Multivariate Meta-Analysis Model (k = 92; method: REML)
## 
##   logLik  Deviance       AIC       BIC      AICc 
##  -7.8496   15.6993   27.6993   42.6311   28.7237   
## 
## Variance Components:
## 
##             estim    sqrt  nlvls  fixed    factor 
## sigma^2.1  0.0099  0.0995     30     no  Study_ID 
## sigma^2.2  0.0321  0.1792     92     no     ES_ID 
## sigma^2.3  0.0000  0.0000      6     no    Strain 
## 
## Test for Residual Heterogeneity:
## QE(df = 89) = 661.8903, p-val < .0001
## 
## Test of Moderators (coefficients 1:3):
## F(df1 = 3, df2 = 89) = 12.7993, p-val < .0001
## 
## Model Results:
## 
##                         estimate      se    tval  df    pval    ci.lb   ci.ub 
## Type_assayConditioning    0.2167  0.0351  6.1650  89  <.0001   0.1468  0.2865 
## Type_assayHabituation     0.1821  0.1147  1.5886  89  0.1157  -0.0457  0.4100 
## Type_assayRecognition     0.0554  0.0640  0.8659  89  0.3889  -0.0717  0.1826 
##  
## Type_assayConditioning  *** 
## Type_assayHabituation 
## Type_assayRecognition 
## 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
r2_ml(mod_E1) 
##   R2_marginal R2_coditional 
##    0.07376134    1.00000000
Learning_E <- orchard_plot(mod_E1, mod = "Type_assay", xlab = "lnRR", alpha=0.4) + 
  geom_errorbarh(aes(xmin = lowerPR, xmax = upperPR), height = 0, show.legend = FALSE, size = 1.1, alpha = 0.5) + # prediction intervals
  geom_errorbarh(aes(xmin = lowerCL, xmax = upperCL), height = 0.05, show.legend = FALSE, size = 2) + # confidence intervals
  xlim(-0.5, 2) + 
  geom_point(aes(fill = name),  size = 5, shape = 21)+ # mean estimate
  scale_size_continuous(range = c(1, 7))+ # change point scaling
  theme(panel.border = element_rect(colour = "black", fill=NA, size=1.3), # border around the plot
        text = element_text(size = 15), # change font sizes
        legend.title = element_text(size = 10),
        legend.text = element_text(size = 10)) 

Learning_E

Learning vs Memory

mod_E2 <-  rma.mv(yi = lnRR_Ea, V = VCV_E, mod = ~Learning_vs_memory-1, random = list(~1|Study_ID,
                                                                                        ~1|ES_ID,
                                                                                        ~1|Strain),
                  test = "t",
                  data = dat)

summary(mod_E2) 
## 
## Multivariate Meta-Analysis Model (k = 92; method: REML)
## 
##   logLik  Deviance       AIC       BIC      AICc 
##  -9.3793   18.7586   28.7586   41.2577   29.4729   
## 
## Variance Components:
## 
##             estim    sqrt  nlvls  fixed    factor 
## sigma^2.1  0.0076  0.0873     30     no  Study_ID 
## sigma^2.2  0.0340  0.1843     92     no     ES_ID 
## sigma^2.3  0.0000  0.0000      6     no    Strain 
## 
## Test for Residual Heterogeneity:
## QE(df = 90) = 802.5794, p-val < .0001
## 
## Test of Moderators (coefficients 1:2):
## F(df1 = 2, df2 = 90) = 18.2861, p-val < .0001
## 
## Model Results:
## 
##                             estimate      se    tval  df    pval   ci.lb 
## Learning_vs_memoryLearning    0.2303  0.0450  5.1227  90  <.0001  0.1410 
## Learning_vs_memoryMemory      0.1624  0.0355  4.5713  90  <.0001  0.0919 
##                              ci.ub 
## Learning_vs_memoryLearning  0.3197  *** 
## Learning_vs_memoryMemory    0.2330  *** 
## 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
r2_ml(mod_E2) 
##   R2_marginal R2_coditional 
##    0.02572583    1.00000000
LvsM_E<- orchard_plot(mod_E2, mod = "Learning_vs_memory", xlab = "lnRR", alpha=0.4) + 
  geom_errorbarh(aes(xmin = lowerPR, xmax = upperPR), height = 0, show.legend = FALSE, size = 1.1, alpha = 0.5) + # prediction intervals
  geom_errorbarh(aes(xmin = lowerCL, xmax = upperCL), height = 0.05, show.legend = FALSE, size = 2) + # confidence intervals
  xlim(-0.5, 2) + 
  geom_point(aes(fill = name),  size = 5, shape = 21)+ # mean estimate
  scale_size_continuous(range = c(1, 7))+ # change point scaling
  theme(panel.border = element_rect(colour = "black", fill=NA, size=1.3), # border around the plot
        text = element_text(size = 15), # change font sizes
        legend.title = element_text(size = 10),
        legend.text = element_text(size = 10)) 

LvsM_E

Type of reinforcement

dat2 <- filter(dat, Type_reinforcement %in% c("Appetitive", "Aversive", "Not applicable"))
VCV_E2 <- impute_covariance_matrix(vi = dat2$lnRRV_E, cluster = dat2$Study_ID, r = 0.5)
mod_E3 <- rma.mv(yi = lnRR_Ea, V = VCV_E2, mod = ~ Type_reinforcement-1, random = list(~1|Study_ID,
                                                                                            ~1|ES_ID,
                                                                                            ~1|Strain),
                 test = "t",
                 data = dat2)

summary(mod_E3)
## 
## Multivariate Meta-Analysis Model (k = 92; method: REML)
## 
##   logLik  Deviance       AIC       BIC      AICc 
##  -7.8702   15.7405   27.7405   42.6723   28.7649   
## 
## Variance Components:
## 
##             estim    sqrt  nlvls  fixed    factor 
## sigma^2.1  0.0109  0.1046     30     no  Study_ID 
## sigma^2.2  0.0319  0.1787     92     no     ES_ID 
## sigma^2.3  0.0000  0.0000      6     no    Strain 
## 
## Test for Residual Heterogeneity:
## QE(df = 89) = 764.5984, p-val < .0001
## 
## Test of Moderators (coefficients 1:3):
## F(df1 = 3, df2 = 89) = 12.4138, p-val < .0001
## 
## Model Results:
## 
##                                   estimate      se    tval  df    pval    ci.lb 
## Type_reinforcementAppetitive        0.2175  0.0726  2.9942  89  0.0036   0.0732 
## Type_reinforcementAversive          0.2191  0.0410  5.3456  89  <.0001   0.1377 
## Type_reinforcementNot applicable    0.0812  0.0560  1.4504  89  0.1505  -0.0300 
##                                    ci.ub 
## Type_reinforcementAppetitive      0.3618   ** 
## Type_reinforcementAversive        0.3006  *** 
## Type_reinforcementNot applicable  0.1924      
## 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
r2_ml(mod_E3) 
##   R2_marginal R2_coditional 
##    0.07720103    1.00000000
Reinforcement_E <-orchard_plot(mod_E3, mod = "Type_reinforcement", xlab = "lnRR", alpha=0.4) + 
  geom_errorbarh(aes(xmin = lowerPR, xmax = upperPR), height = 0, show.legend = FALSE, size = 1.1, alpha = 0.5) + # prediction intervals
  geom_errorbarh(aes(xmin = lowerCL, xmax = upperCL), height = 0.05, show.legend = FALSE, size = 2) + # confidence intervals
  xlim(-0.5, 2) + 
  geom_point(aes(fill = name),  size = 5, shape = 21)+ # mean estimate
  scale_size_continuous(range = c(1, 7))+ # change point scaling
  theme(panel.border = element_rect(colour = "black", fill=NA, size=1.3), # border around the plot
        text = element_text(size = 15), # change font sizes
        legend.title = element_text(size = 10),
        legend.text = element_text(size = 10)) 

Reinforcement_E

Social enrichment

dat5 <- filter(dat, EE_social %in% c("Social", "Non-social"))
VCV_E5 <- impute_covariance_matrix(vi = dat5$lnRRV_E, cluster = dat$Study_ID, r = 0.5)
  
mod_E4<- rma.mv(yi = lnRR_Ea, V = VCV_E5, mod = ~EE_social-1, random = list(~1|Study_ID, 
                                                                             ~1|ES_ID,
                                                                             ~1|Strain),
                test = "t",data = dat5)

summary(mod_E4)
## 
## Multivariate Meta-Analysis Model (k = 92; method: REML)
## 
##   logLik  Deviance       AIC       BIC      AICc 
##  -9.3254   18.6507   28.6507   41.1498   29.3650   
## 
## Variance Components:
## 
##             estim    sqrt  nlvls  fixed    factor 
## sigma^2.1  0.0095  0.0974     30     no  Study_ID 
## sigma^2.2  0.0340  0.1844     92     no     ES_ID 
## sigma^2.3  0.0000  0.0000      6     no    Strain 
## 
## Test for Residual Heterogeneity:
## QE(df = 90) = 801.5313, p-val < .0001
## 
## Test of Moderators (coefficients 1:2):
## F(df1 = 2, df2 = 90) = 17.0110, p-val < .0001
## 
## Model Results:
## 
##                      estimate      se    tval  df    pval   ci.lb   ci.ub 
## EE_socialNon-social    0.1413  0.0498  2.8349  90  0.0057  0.0423  0.2403   ** 
## EE_socialSocial        0.2204  0.0432  5.0976  90  <.0001  0.1345  0.3063  *** 
## 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
r2_ml(mod_E4) 
##   R2_marginal R2_coditional 
##    0.03377455    1.00000000
Social_E <-orchard_plot(mod_E4, mod = "EE_social", xlab = "lnRR", alpha=0.4) + 
  geom_errorbarh(aes(xmin = lowerPR, xmax = upperPR), height = 0, show.legend = FALSE, size = 1.1, alpha = 0.5) + # prediction intervals
  geom_errorbarh(aes(xmin = lowerCL, xmax = upperCL), height = 0.05, show.legend = FALSE, size = 2) + # confidence intervals
  xlim(-0.5, 2) + 
  geom_point(aes(fill = name),  size = 5, shape = 21)+ # mean estimate
  scale_size_continuous(range = c(1, 7))+ # change point scaling
  theme(panel.border = element_rect(colour = "black", fill=NA, size=1.3), # border around the plot
       text = element_text(size = 15), # change font sizes
        legend.title = element_text(size = 10),
        legend.text = element_text(size = 10)) 

Social_E 

Exercise enrichment

mod_E5<- rma.mv(yi = lnRR_Ea, V = VCV_E, mod = ~EE_exercise-1, random = list(~1|Study_ID,
                                                                               ~1|ES_ID,
                                                                               ~1|Strain),
                test = "t",
                data = dat)

summary(mod_E5)
## 
## Multivariate Meta-Analysis Model (k = 92; method: REML)
## 
##   logLik  Deviance       AIC       BIC      AICc 
## -10.0303   20.0606   30.0606   42.5597   30.7749   
## 
## Variance Components:
## 
##             estim    sqrt  nlvls  fixed    factor 
## sigma^2.1  0.0096  0.0980     30     no  Study_ID 
## sigma^2.2  0.0345  0.1857     92     no     ES_ID 
## sigma^2.3  0.0000  0.0000      6     no    Strain 
## 
## Test for Residual Heterogeneity:
## QE(df = 90) = 807.7169, p-val < .0001
## 
## Test of Moderators (coefficients 1:2):
## F(df1 = 2, df2 = 90) = 16.1666, p-val < .0001
## 
## Model Results:
## 
##                         estimate      se    tval  df    pval   ci.lb   ci.ub 
## EE_exerciseExercise       0.1849  0.0407  4.5464  90  <.0001  0.1041  0.2657 
## EE_exerciseNo exercise    0.1900  0.0556  3.4151  90  0.0010  0.0795  0.3005 
##  
## EE_exerciseExercise     *** 
## EE_exerciseNo exercise  *** 
## 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
r2_ml(mod_E5) 
##   R2_marginal R2_coditional 
##  0.0001360993  0.9999999987
Exercise_E <-orchard_plot(mod_E5, mod = "EE_exercise", xlab = "lnRR", alpha=0.4) + 
  geom_errorbarh(aes(xmin = lowerPR, xmax = upperPR), height = 0, show.legend = FALSE, size = 1.1, alpha = 0.5) + # prediction intervals
  geom_errorbarh(aes(xmin = lowerCL, xmax = upperCL), height = 0.05, show.legend = FALSE, size = 2) + # confidence intervals
  xlim(-0.5, 2) + 
  geom_point(aes(fill = name),  size = 5, shape = 21)+ # mean estimate
  scale_size_continuous(range = c(1, 7))+ # change point scaling
  theme(panel.border = element_rect(colour = "black", fill=NA, size=1.3), # border around the plot
        text = element_text(size = 15), # change font sizes
        legend.title = element_text(size = 10),
        legend.text = element_text(size = 10)) 

Exercise_E

Age of enrichment

dat6 <- filter(dat, Age_EE_exposure %in% c("Adult", "Adolescent"))
VCV_E6 <- impute_covariance_matrix(vi = dat6$lnRRV_E, cluster = dat6$Study_ID, r = 0.5)


mod_E6 <- rma.mv(yi = lnRR_Ea, V = VCV_E6, mod = ~Age_EE_exposure-1, random = list(~1|Study_ID,
                                                                                    ~1|ES_ID,
                                                                                    ~1|Strain),
                 test = "t",
                 data = dat6)

summary(mod_E6) 
## 
## Multivariate Meta-Analysis Model (k = 88; method: REML)
## 
##   logLik  Deviance       AIC       BIC      AICc 
##  -6.9490   13.8980   23.8980   36.1698   24.6480   
## 
## Variance Components:
## 
##             estim    sqrt  nlvls  fixed    factor 
## sigma^2.1  0.0078  0.0885     29     no  Study_ID 
## sigma^2.2  0.0327  0.1808     88     no     ES_ID 
## sigma^2.3  0.0000  0.0000      6     no    Strain 
## 
## Test for Residual Heterogeneity:
## QE(df = 86) = 782.6092, p-val < .0001
## 
## Test of Moderators (coefficients 1:2):
## F(df1 = 2, df2 = 86) = 18.9060, p-val < .0001
## 
## Model Results:
## 
##                            estimate      se    tval  df    pval   ci.lb   ci.ub 
## Age_EE_exposureAdolescent    0.1799  0.0370  4.8553  86  <.0001  0.1062  0.2535 
## Age_EE_exposureAdult         0.2340  0.0620  3.7734  86  0.0003  0.1107  0.3573 
##  
## Age_EE_exposureAdolescent  *** 
## Age_EE_exposureAdult       *** 
## 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
r2_ml(mod_E6) 
##   R2_marginal R2_coditional 
##    0.01127347    1.00000000
Age_E<- orchard_plot(mod_E6, mod = "Age_EE_exposure", xlab = "lnRR", alpha=0.4) + 
  geom_errorbarh(aes(xmin = lowerPR, xmax = upperPR), height = 0, show.legend = FALSE, size = 1.1, alpha = 0.5) + # prediction intervals
  geom_errorbarh(aes(xmin = lowerCL, xmax = upperCL), height = 0.05, show.legend = FALSE, size = 2) + # confidence intervals
  xlim(-0.5, 2) + 
  geom_point(aes(fill = name),  size = 5, shape = 21)+ # mean estimate
  scale_size_continuous(range = c(1, 7))+ # change point scaling
  theme(panel.border = element_rect(colour = "black", fill=NA, size=1.3), # border around the plot
        text = element_text(size = 15), # change font sizes
        legend.title = element_text(size = 10),
        legend.text = element_text(size = 10))  

Age_E

Multi-moderator model

# filter data so that all K < 5 are removed
dat_Efm <- dat %>%
  filter(Type_assay %in% c("Recognition", "Habituation", "Conditioning"),
         Type_reinforcement %in% c("Appetitive", "Aversive", "Not applicable"),
         EE_social %in% c("Social", "Non-social"), 
         Age_EE_exposure %in% c("Adult", "Adolescent"))

VCV_Efm <- impute_covariance_matrix(vi = dat_Efm$lnRRV_E, cluster = dat_Efm$Study_ID, r = 0.5)
                 
mod_Efm <- rma.mv(yi = lnRR_Sa, V = VCV_Efm, mod = ~Type_assay-1 + Learning_vs_memory + Type_reinforcement + EE_social + EE_exercise + Age_EE_exposure , random =   list(~1|Study_ID,
                                                                                    ~1|ES_ID,
                                                                                    ~1|Strain),
                    test = "t",
                 data = dat_Efm)
#summary(mod_Efm)
#r2_ml(mod_Efm) 

res_Efm <- dredge(mod_Efm, trace=2)
saveRDS(res_Efm, file = here("Rdata", "res_Efm.rds"))
# also saving the full model and data
saveRDS(mod_Efm, file = here("Rdata", "mod_Efm.rds"))
saveRDS(dat_Efm, file = here("Rdata", "dat_Efm.rds"))
dat_Efm <- readRDS(file = here("Rdata", "dat_Efm.rds"))
mod_Efm <- readRDS(file = here("Rdata", "mod_Efm.rds"))
res_Efm <- readRDS(file = here("Rdata", "res_Efm.rds"))
res_Efm2<- subset(res_Efm, delta <= 6, recalc.weights=FALSE)
importance(res_Efm2)
##                      Age_EE_exposure Type_assay EE_exercise EE_social
## Sum of weights:      0.63            0.36       0.16        0.14     
## N containing models:   11              10          5           5     
##                      Learning_vs_memory Type_reinforcement
## Sum of weights:      0.10               0.07              
## N containing models:    4                  4

Publication bias & sensitivity analysis

Publication bias tests

# funnel plot
Funnel_E<-funnel(mod_Efm, xlab = "lnRR", ylab = "Standard Error")

Funnel_E
#year published was scaled previously  under stress PB

dat_Efm$sqrt_inv_e_n <- with(dat_Efm, sqrt(1/CC_n + 1/EC_n + 1/ES_n + 1/CS_n))

PB_MR_E<- rma.mv(lnRR_Sa, lnRRV_S, mods = ~1 + sqrt_inv_e_n +  Learning_vs_memory + Year_published + Type_assay + Type_reinforcement + EE_social + EE_exercise + Age_stress_exposure, random = list(~1|Study_ID,
                                                          ~1|ES_ID,
                                                          ~1|Strain), method = "REML", test = "t", 
    data = dat_Efm)

estimates_PB_MR_E<- estimates.CI(PB_MR_E)
#estimates_PB_MR_E

Leave-one-out analysis

dat$Study_ID <- as.factor(dat$Study_ID)

LeaveOneOut_effectsize <- list()
for(i in 1:length(levels(dat$Study_ID))){
  LeaveOneOut_effectsize[[i]] <- rma.mv(yi = lnRR_Ea, V = lnRRV_E, 
                                        random = list(~1 | Study_ID,~1| ES_ID, ~1 | Strain), 
                                        method = "REML", data = dat[dat$Study_ID
                                                                    != levels(dat$Study_ID)[i], ])}


# writing function for extracting est, ci.lb, and ci.ub from all models
est.func <- function(mod_E0){
  df <- data.frame(est = mod_E0$b, lower = mod_E0$ci.lb, upper = mod_E0$ci.ub)
  return(df)
}


#using dplyr to form data frame
MA_CVR_E <- lapply(LeaveOneOut_effectsize, function(x) est.func(x))%>% bind_rows %>% mutate(left_out = levels(dat$Study_ID))


saveRDS(MA_CVR_E,file = here("Rdata", "MA_CVR_E.rds"))
#telling ggplot to stop reordering factors
MA_CVR_E <- readRDS(file = here("Rdata", "MA_CVR_E.rds"))

MA_CVR_E$left_out<- as.factor(MA_CVR_E$left_out)
MA_CVR_E$left_out<-factor(MA_CVR_E$left_out, levels = MA_CVR_E$left_out)


#plotting
leaveoneout_E <- ggplot(MA_CVR_E) +
  geom_hline(yintercept = 0, lty = 2, lwd = 1) +
  geom_hline(yintercept = mod_E0$ci.lb, lty = 3, lwd = 0.75, colour = "black") +
  geom_hline(yintercept = mod_E0$b, lty = 1, lwd = 0.75, colour = "black") +
  geom_hline(yintercept = mod_E0$ci.ub, lty = 3, lwd = 0.75, colour = "black") +
  geom_pointrange(aes(x = left_out, y = est, ymin = lower, ymax = upper)) +
  xlab("Study left out") + 
  ylab("lnRR, 95% CI") + 
  coord_flip() +
  theme(panel.grid.minor = element_blank())+
  theme_bw() + theme(panel.grid.major = element_blank()) +
  theme(panel.grid.minor.x = element_blank() ) +
  theme(axis.text.y = element_text(size = 6))

leaveoneout_E

dat$Study_ID <- as.integer(dat$Study_ID)

Stress

Meta-analysis

mod_S0 <- rma.mv(yi = lnRR_Sa, V = VCV_S, random = list(~1|Study_ID,
                                                          ~1|ES_ID,
                                                          ~1|Strain),
                 test = "t", 
                 data = dat)

summary(mod_S0) 
## 
## Multivariate Meta-Analysis Model (k = 92; method: REML)
## 
##   logLik  Deviance       AIC       BIC      AICc 
## -14.1156   28.2312   36.2312   46.2747   36.6964   
## 
## Variance Components:
## 
##             estim    sqrt  nlvls  fixed    factor 
## sigma^2.1  0.0099  0.0993     30     no  Study_ID 
## sigma^2.2  0.0377  0.1941     92     no     ES_ID 
## sigma^2.3  0.0000  0.0000      6     no    Strain 
## 
## Test for Heterogeneity:
## Q(df = 91) = 946.9234, p-val < .0001
## 
## Model Results:
## 
## estimate      se     tval  df    pval    ci.lb    ci.ub 
##  -0.1052  0.0337  -3.1217  91  0.0024  -0.1721  -0.0383  ** 
## 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
i2_ml(mod_S0) 
##     I2_total  I2_Study_ID     I2_ES_ID    I2_Strain 
## 9.376124e-01 1.946168e-01 7.429955e-01 1.975455e-10
orchard_plot(mod_S0, mod = "Int", xlab = "lnRR", alpha=0.4) + 
  geom_errorbarh(aes(xmin = lowerPR, xmax = upperPR), height = 0, show.legend = FALSE, size = 1.1, alpha = 0.5) + # prediction intervals
  geom_errorbarh(aes(xmin = lowerCL, xmax = upperCL), height = 0.05, show.legend = FALSE, size = 2) + # confidence intervals
  geom_point(aes(fill = name),  size = 5, shape = 21)+ # mean estimate
  scale_size_continuous(range = c(1, 7))+ # change point scaling
  theme(panel.border = element_rect(colour = "black", fill=NA, size=1.3), # border around the plot
        text = element_text(size = 24), # change font sizes
        legend.title = element_text(size = 15),
        legend.text = element_text(size = 13)) 

Meta-regression: uni-moderator

Type of assay

dat$Type_assay<-as.factor(dat$Type_assay)

VCV_S1 <- impute_covariance_matrix(vi = dat1$lnRRV_S, cluster = dat$Study_ID, r = 0.5)


mod_S1 <- rma.mv(yi = lnRR_Sa, V = VCV_S1, mod = ~Type_assay-1, random =   list(~1|Study_ID,
                                                                                    ~1|ES_ID,
                                                                                    ~1|Strain),
                 test = "t",
                 data = dat1)

summary(mod_S1)
## 
## Multivariate Meta-Analysis Model (k = 92; method: REML)
## 
##   logLik  Deviance       AIC       BIC      AICc 
##  -9.8028   19.6055   31.6055   46.5374   32.6299   
## 
## Variance Components:
## 
##             estim    sqrt  nlvls  fixed    factor 
## sigma^2.1  0.0161  0.1271     30     no  Study_ID 
## sigma^2.2  0.0279  0.1671     92     no     ES_ID 
## sigma^2.3  0.0000  0.0000      6     no    Strain 
## 
## Test for Residual Heterogeneity:
## QE(df = 89) = 723.4973, p-val < .0001
## 
## Test of Moderators (coefficients 1:3):
## F(df1 = 3, df2 = 89) = 6.7053, p-val = 0.0004
## 
## Model Results:
## 
##                         estimate      se     tval  df    pval    ci.lb    ci.ub 
## Type_assayConditioning   -0.0981  0.0375  -2.6192  89  0.0104  -0.1725  -0.0237 
## Type_assayHabituation    -0.4615  0.1126  -4.0969  89  <.0001  -0.6853  -0.2377 
## Type_assayRecognition    -0.0534  0.0645  -0.8287  89  0.4095  -0.1816   0.0747 
##  
## Type_assayConditioning    * 
## Type_assayHabituation   *** 
## Type_assayRecognition 
## 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
r2_ml(mod_S1) 
##   R2_marginal R2_coditional 
##     0.1853359     1.0000000
Learning_S <-orchard_plot(mod_S1, mod = "Type_assay", xlab = "lnRR", alpha=0.4) + 
  geom_errorbarh(aes(xmin = lowerPR, xmax = upperPR), height = 0, show.legend = FALSE, size = 1.1, alpha = 0.5) + # prediction intervals
  geom_errorbarh(aes(xmin = lowerCL, xmax = upperCL), height = 0.05, show.legend = FALSE, size = 2) + # confidence intervals
  geom_point(aes(fill = name),  size = 5, shape = 21)+ # mean estimate
  scale_size_continuous(range = c(1, 7))+ # change point scaling
  theme(panel.border = element_rect(colour = "black", fill=NA, size=1.3), # border around the plot
        text = element_text(size = 15), # change font sizes
        legend.title = element_text(size = 10),
        legend.text = element_text(size = 10)) 

Learning_S

Learning vs Memory

mod_S2 <-  rma.mv(yi = lnRR_Sa, V = VCV_S, mod = ~Learning_vs_memory-1, random = list(~1|Study_ID,
                                                                                        ~1|ES_ID,
                                                                                        ~1|Strain),
                  test = "t",
                  data = dat)

summary(mod_S2) 
## 
## Multivariate Meta-Analysis Model (k = 92; method: REML)
## 
##   logLik  Deviance       AIC       BIC      AICc 
## -14.5281   29.0562   39.0562   51.5553   39.7705   
## 
## Variance Components:
## 
##             estim    sqrt  nlvls  fixed    factor 
## sigma^2.1  0.0094  0.0970     30     no  Study_ID 
## sigma^2.2  0.0388  0.1969     92     no     ES_ID 
## sigma^2.3  0.0000  0.0000      6     no    Strain 
## 
## Test for Residual Heterogeneity:
## QE(df = 90) = 946.3930, p-val < .0001
## 
## Test of Moderators (coefficients 1:2):
## F(df1 = 2, df2 = 90) = 5.0145, p-val = 0.0086
## 
## Model Results:
## 
##                             estimate      se     tval  df    pval    ci.lb 
## Learning_vs_memoryLearning   -0.1211  0.0476  -2.5423  90  0.0127  -0.2157 
## Learning_vs_memoryMemory     -0.0974  0.0380  -2.5648  90  0.0120  -0.1728 
##                               ci.ub 
## Learning_vs_memoryLearning  -0.0265  * 
## Learning_vs_memoryMemory    -0.0219  * 
## 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
r2_ml(mod_S2) 
##   R2_marginal R2_coditional 
##   0.002776034   1.000000000
LvsM_S <- orchard_plot(mod_S2, mod = "Learning_vs_memory", xlab = "lnRR", alpha=0.4) + 
  geom_errorbarh(aes(xmin = lowerPR, xmax = upperPR), height = 0, show.legend = FALSE, size = 1.1, alpha = 0.5) + # prediction intervals
  geom_errorbarh(aes(xmin = lowerCL, xmax = upperCL), height = 0.05, show.legend = FALSE, size = 2) + # confidence intervals
  geom_point(aes(fill = name),  size = 5, shape = 21)+ # mean estimate
  scale_size_continuous(range = c(1, 7))+ # change point scaling
  theme(panel.border = element_rect(colour = "black", fill=NA, size=1.3), # border around the plot
       text = element_text(size = 15), # change font sizes
        legend.title = element_text(size = 10),
        legend.text = element_text(size = 10)) 

LvsM_S 

Type of reinforcement

VCV_S2 <- impute_covariance_matrix(vi = dat2$lnRRV_S, cluster = dat$Study_ID, r = 0.5)

mod_S3 <- rma.mv(yi = lnRR_Sa, V = VCV_S2, mod = ~ Type_reinforcement-1, random = list(~1|Study_ID,
                                                                                            ~1|ES_ID,
                                                                                            ~1|Strain),
                 test = "t",
                 data = dat2)

summary(mod_S3)
## 
## Multivariate Meta-Analysis Model (k = 92; method: REML)
## 
##   logLik  Deviance       AIC       BIC      AICc 
## -13.8810   27.7621   39.7621   54.6939   40.7864   
## 
## Variance Components:
## 
##             estim    sqrt  nlvls  fixed    factor 
## sigma^2.1  0.0103  0.1016     30     no  Study_ID 
## sigma^2.2  0.0387  0.1966     92     no     ES_ID 
## sigma^2.3  0.0000  0.0000      6     no    Strain 
## 
## Test for Residual Heterogeneity:
## QE(df = 89) = 920.8439, p-val < .0001
## 
## Test of Moderators (coefficients 1:3):
## F(df1 = 3, df2 = 89) = 3.7942, p-val = 0.0130
## 
## Model Results:
## 
##                                   estimate      se     tval  df    pval 
## Type_reinforcementAppetitive       -0.1846  0.0749  -2.4649  89  0.0156 
## Type_reinforcementAversive         -0.0730  0.0427  -1.7081  89  0.0911 
## Type_reinforcementNot applicable   -0.1172  0.0590  -1.9851  89  0.0502 
##                                     ci.lb    ci.ub 
## Type_reinforcementAppetitive      -0.3334  -0.0358  * 
## Type_reinforcementAversive        -0.1579   0.0119  . 
## Type_reinforcementNot applicable  -0.2345   0.0001  . 
## 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
r2_ml(mod_S3) 
##   R2_marginal R2_coditional 
##     0.0366428     1.0000000
Reinforcement_S <-orchard_plot(mod_S3, mod = "Type_reinforcement", xlab = "lnRR", alpha=0.4) + 
  geom_errorbarh(aes(xmin = lowerPR, xmax = upperPR), height = 0, show.legend = FALSE, size = 1.1, alpha = 0.5) + # prediction intervals
  geom_errorbarh(aes(xmin = lowerCL, xmax = upperCL), height = 0.05, show.legend = FALSE, size = 2) + # confidence intervals
  geom_point(aes(fill = name),  size = 5, shape = 21)+ # mean estimate
  scale_size_continuous(range = c(1, 7))+ # change point scaling
  theme(panel.border = element_rect(colour = "black", fill=NA, size=1.3), # border around the plot
       text = element_text(size = 15), # change font sizes
        legend.title = element_text(size = 10),
        legend.text = element_text(size = 10)) 

Reinforcement_S

Type of stress

dat3 <- filter(dat, Type_stress_exposure %in% c("Restraint", "Noise", "MS", "Combination"))
VCV_S3 <- impute_covariance_matrix(vi = dat3$lnRRV_S, cluster = dat3$Study_ID, r = 0.5)

mod_S4 <- rma.mv(yi = lnRR_Sa, V = VCV_S3, mod = ~Type_stress_exposure-1, random = list(~1|Study_ID,
                                                                                         ~1|ES_ID,
                                                                                         ~1|Strain),
                 test = "t",
                 data = dat3)
summary(mod_S4) 
## 
## Multivariate Meta-Analysis Model (k = 85; method: REML)
## 
##   logLik  Deviance       AIC       BIC      AICc 
## -11.4138   22.8276   36.8276   53.5887   38.3618   
## 
## Variance Components:
## 
##             estim    sqrt  nlvls  fixed    factor 
## sigma^2.1  0.0115  0.1071     25     no  Study_ID 
## sigma^2.2  0.0401  0.2002     85     no     ES_ID 
## sigma^2.3  0.0000  0.0000      4     no    Strain 
## 
## Test for Residual Heterogeneity:
## QE(df = 81) = 897.4553, p-val < .0001
## 
## Test of Moderators (coefficients 1:4):
## F(df1 = 4, df2 = 81) = 2.8767, p-val = 0.0278
## 
## Model Results:
## 
##                                  estimate      se     tval  df    pval    ci.lb 
## Type_stress_exposureCombination   -0.0500  0.0892  -0.5605  81  0.5767  -0.2274 
## Type_stress_exposureMS            -0.0539  0.0560  -0.9630  81  0.3384  -0.1653 
## Type_stress_exposureNoise         -0.1203  0.1036  -1.1608  81  0.2491  -0.3265 
## Type_stress_exposureRestraint     -0.2101  0.0704  -2.9863  81  0.0037  -0.3501 
##                                    ci.ub 
## Type_stress_exposureCombination   0.1274     
## Type_stress_exposureMS            0.0575     
## Type_stress_exposureNoise         0.0859     
## Type_stress_exposureRestraint    -0.0701  ** 
## 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
r2_ml(mod_S4)
##   R2_marginal R2_coditional 
##    0.07029554    1.00000000
Stressor<- orchard_plot(mod_S4, mod = "Type_stress_exposure", xlab = "lnRR", alpha=0.4) + 
  geom_errorbarh(aes(xmin = lowerPR, xmax = upperPR), height = 0, show.legend = FALSE, size = 1.1, alpha = 0.5) + # prediction intervals
  geom_errorbarh(aes(xmin = lowerCL, xmax = upperCL), height = 0.05, show.legend = FALSE, size = 2) + # confidence intervals
  geom_point(aes(fill = name),  size = 5, shape = 21)+ # mean estimate
  scale_size_continuous(range = c(1, 7))+ # change point scaling
  theme(panel.border = element_rect(colour = "black", fill=NA, size=1.3), # border around the plot
        text = element_text(size = 15), # change font sizes
        legend.title = element_text(size = 10),
        legend.text = element_text(size = 10)) 

Stressor

Age of stress

VCV_S3a <- impute_covariance_matrix(vi = dat$lnRRV_S, cluster = dat$Study_ID, r = 0.5)

mod_S5 <-rma.mv(yi = lnRR_Sa, V = VCV_S3a, mod = ~Age_stress_exposure-1, random = list(~1|Study_ID,
                                                                                       ~1|ES_ID,
                                                                                       ~1|Strain),
                test = "t",
                data = dat)
summary(mod_S5) 
## 
## Multivariate Meta-Analysis Model (k = 92; method: REML)
## 
##   logLik  Deviance       AIC       BIC      AICc 
## -12.4083   24.8166   38.8166   56.1579   40.2166   
## 
## Variance Components:
## 
##             estim    sqrt  nlvls  fixed    factor 
## sigma^2.1  0.0048  0.0694     30     no  Study_ID 
## sigma^2.2  0.0392  0.1979     92     no     ES_ID 
## sigma^2.3  0.0000  0.0000      6     no    Strain 
## 
## Test for Residual Heterogeneity:
## QE(df = 88) = 881.1229, p-val < .0001
## 
## Test of Moderators (coefficients 1:4):
## F(df1 = 4, df2 = 88) = 4.3703, p-val = 0.0029
## 
## Model Results:
## 
##                                     estimate      se     tval  df    pval 
## Age_stress_exposureAdolescent         0.0074  0.1159   0.0641  88  0.9490 
## Age_stress_exposureAdult             -0.2279  0.0622  -3.6664  88  0.0004 
## Age_stress_exposureEarly postnatal   -0.0561  0.0435  -1.2891  88  0.2007 
## Age_stress_exposurePrenatal          -0.1145  0.0743  -1.5404  88  0.1271 
##                                       ci.lb    ci.ub 
## Age_stress_exposureAdolescent       -0.2228   0.2377      
## Age_stress_exposureAdult            -0.3514  -0.1044  *** 
## Age_stress_exposureEarly postnatal  -0.1425   0.0304      
## Age_stress_exposurePrenatal         -0.2621   0.0332      
## 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
r2_ml(mod_S5) 
##   R2_marginal R2_coditional 
##    0.09987307    1.00000000
Age_S <- orchard_plot(mod_S5, mod = "Age_stress_exposure", xlab = "lnRR", alpha=0.4) + 
  geom_errorbarh(aes(xmin = lowerPR, xmax = upperPR), height = 0, show.legend = FALSE, size = 1.1, alpha = 0.5) + # prediction intervals
  geom_errorbarh(aes(xmin = lowerCL, xmax = upperCL), height = 0.05, show.legend = FALSE, size = 2) + # confidence intervals
  geom_point(aes(fill = name),  size = 5, shape = 21)+ # mean estimate
  scale_size_continuous(range = c(1, 7))+ # change point scaling
  theme(panel.border = element_rect(colour = "black", fill=NA, size=1.3), # border around the plot
        text = element_text(size = 15), # change font sizes
        legend.title = element_text(size = 10),
        legend.text = element_text(size = 10)) 

Age_S 

Stess duration

dat4 <- filter(dat, Stress_duration %in% c("Chronic", "Acute"))
VCV_S4 <- impute_covariance_matrix(vi = dat4$lnRRV_S, cluster = dat4$Study_ID, r = 0.5)

mod_S6 <-rma.mv(yi = lnRR_Sa, V = VCV_S4, mod = ~Stress_duration-1, random = list(~1|Study_ID,
                                                                                   ~1|ES_ID,
                                                                                   ~1|Strain),
                test = "t",
                data = dat4)
summary(mod_S6) 
## 
## Multivariate Meta-Analysis Model (k = 89; method: REML)
## 
##   logLik  Deviance       AIC       BIC      AICc 
## -13.7898   27.5796   37.5796   49.9092   38.3204   
## 
## Variance Components:
## 
##             estim    sqrt  nlvls  fixed    factor 
## sigma^2.1  0.0062  0.0786     29     no  Study_ID 
## sigma^2.2  0.0391  0.1978     89     no     ES_ID 
## sigma^2.3  0.0000  0.0000      6     no    Strain 
## 
## Test for Residual Heterogeneity:
## QE(df = 87) = 915.9393, p-val < .0001
## 
## Test of Moderators (coefficients 1:2):
## F(df1 = 2, df2 = 87) = 6.6661, p-val = 0.0020
## 
## Model Results:
## 
##                         estimate      se     tval  df    pval    ci.lb    ci.ub 
## Stress_durationAcute      0.0135  0.0659   0.2045  87  0.8384  -0.1176   0.1445 
## Stress_durationChronic   -0.1360  0.0373  -3.6456  87  0.0005  -0.2101  -0.0618 
##  
## Stress_durationAcute 
## Stress_durationChronic  *** 
## 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
r2_ml(mod_S6) 
##   R2_marginal R2_coditional 
##    0.08245896    1.00000000
Duration_S <- orchard_plot(mod_S6, mod = "Stress_duration", xlab = "lnRR", alpha=0.4) + 
  geom_errorbarh(aes(xmin = lowerPR, xmax = upperPR), height = 0, show.legend = FALSE, size = 1.1, alpha = 0.5) + # prediction intervals
  geom_errorbarh(aes(xmin = lowerCL, xmax = upperCL), height = 0.05, show.legend = FALSE, size = 2) + # confidence intervals
  geom_point(aes(fill = name),  size = 5, shape = 21)+ # mean estimate
  scale_size_continuous(range = c(1, 7))+ # change point scaling
  theme(panel.border = element_rect(colour = "black", fill=NA, size=1.3), # border around the plot
        text = element_text(size = 15), # change font sizes
        legend.title = element_text(size = 10),
        legend.text = element_text(size = 10)) 

Duration_S 

Multi-moderator model

#selecting moderator levels with k >=5
dat_Sfm <- dat %>%
  filter(Type_assay %in% c("Recognition", "Habituation", "Conditioning"),
         Type_reinforcement %in% c("Appetitive", "Aversive", "Not applicable"),
         Type_stress_exposure %in% c("Restraint", "Noise", "MS", "Combination"),
         Stress_duration %in% c("Chronic", "Acute"))

VCV_Sfm <- impute_covariance_matrix(vi = dat_Sfm$lnRRV_E, cluster = dat_Sfm$Study_ID, r = 0.5)
                 
mod_Sfm <- rma.mv(yi = lnRR_Sa, V = VCV_Sfm, mod = ~ Type_assay -1 + Learning_vs_memory + Type_reinforcement + Type_stress_exposure + Age_stress_exposure + Stress_duration, random =   list(~1|Study_ID,
                                                                                    ~1|ES_ID,
                                                                                    ~1|Strain),
                    test = "t",
                 data = dat_Sfm)
#summary(mod_Sfm)
#r2_ml(mod_Sfm) 

res_Sfm <- dredge(mod_Sfm, trace=2)
saveRDS(res_Sfm, file = here("Rdata", "res_Sfm.rds"))
# also saving the full model and data
saveRDS(mod_Sfm, file = here("Rdata", "mod_Sfm.rds"))
saveRDS(dat_Sfm, file = here("Rdata", "dat_Sfm.rds"))
dat_Sfm <- readRDS(file = here("Rdata", "dat_Sfm.rds"))
mod_Sfm <- readRDS(file = here("Rdata", "mod_Sfm.rds"))
res_Sfm <- readRDS(file = here("Rdata", "res_Sfm.rds"))
res_Sfm2<- subset(res_Sfm, delta <= 6, recalc.weights=FALSE)
importance(res_Sfm2) 
##                      Type_assay Stress_duration Type_stress_exposure
## Sum of weights:      0.91       0.88            0.22                
## N containing models:    7          6               2                
##                      Learning_vs_memory Age_stress_exposure Type_reinforcement
## Sum of weights:      0.16               0.04                0.04              
## N containing models:    2                  1                   1

Publication bias & sensitivity analysis

Publication bias

# funnel plot
Funnel_S <- funnel(mod_Sfm, xlab = "lnRR", ylab = "Standard Error")

Funnel_S

#calculating inv effective sample size for use in full meta-regression
dat_Sfm$sqrt_inv_e_n <- with(dat_Sfm, sqrt(1/CC_n + 1/EC_n + 1/ES_n + 1/CS_n))

#time lag bias and eggers regression
dat_Sfm$c_Year_published <- as.vector(scale(dat_Sfm$Year_published, scale = F))

PB_MR_S<- rma.mv(lnRR_Sa, lnRRV_S, mods = ~1 + sqrt_inv_e_n +  c_Year_published + Type_assay +Learning_vs_memory + Type_reinforcement + Type_stress_exposure + Age_stress_exposure, random = list(~1|Study_ID,
                                                          ~1|ES_ID,
                                                          ~1|Strain), 
                 method = "REML", 
                 test = "t", 
                 data = dat_Sfm,
                  control=list(optimizer="optim", optmethod="Nelder-Mead"))

estimates_PB_MR_S<- estimates.CI(PB_MR_S)
#estimates_PB_MR_S

Leave-one-out sensitivity analysis

dat$Study_ID <- as.factor(dat$Study_ID)

LeaveOneOut_effectsize <- list()
for(i in 1:length(levels(dat$Study_ID))){
  LeaveOneOut_effectsize[[i]] <- rma.mv(yi = lnRR_Sa, V = lnRRV_S, 
                                        random = list(~1 | Study_ID,~1| ES_ID, ~1 | Strain), 
                                        method = "REML", data = dat[dat$Study_ID
                                                                    != levels(dat$Study_ID)[i], ])}


# writing function for extracting est, ci.lb, and ci.ub from all models
est.func <- function(mod_E0){
  df <- data.frame(est = mod_E0$b, lower = mod_E0$ci.lb, upper = mod_E0$ci.ub)
  return(df)
}


#using dplyr to form data frame
MA_CVR_S <- lapply(LeaveOneOut_effectsize, function(x) est.func(x))%>% bind_rows %>% mutate(left_out = levels(dat$Study_ID))

saveRDS(MA_CVR_S,file = here("Rdata", "MA_CVR_S.rds"))
MA_CVR_S <- readRDS(file = here("Rdata", "MA_CVR_S.rds"))

#telling ggplot to stop reordering factors
MA_CVR_S$left_out<- as.factor(MA_CVR_S$left_out)
MA_CVR_S$left_out<-factor(MA_CVR_S$left_out, levels = MA_CVR_S$left_out)

#plotting
leaveoneout_S <- ggplot(MA_CVR_S) +
  geom_hline(yintercept = 0, lty = 2, lwd = 1) +
  geom_hline(yintercept = mod_S0$ci.lb, lty = 3, lwd = 0.75, colour = "black") +
  geom_hline(yintercept = mod_S0$b, lty = 1, lwd = 0.75, colour = "black") +
  geom_hline(yintercept = mod_S0$ci.ub, lty = 3, lwd = 0.75, colour = "black") +
  geom_pointrange(aes(x = left_out, y = est, ymin = lower, ymax = upper)) +
  xlab("Study left out") + 
  ylab("lnRR, 95% CI") + 
  coord_flip() +
  theme(panel.grid.minor = element_blank())+
  theme_bw() + theme(panel.grid.major = element_blank()) +
  theme(panel.grid.minor.x = element_blank() ) +
  theme(axis.text.y = element_text(size = 6))

leaveoneout_S

dat$Study_ID <- as.integer(dat$Study_ID)

Interaction of stress and EE

Meta-analysis

mod_ES0 <- rma.mv(yi = lnRR_ESa, V = VCV_ES, random = list(~1|Study_ID,
                                                             ~1|ES_ID,
                                                             ~1|Strain),
                  test = "t", 
                  data = dat)

summary(mod_ES0) 
## 
## Multivariate Meta-Analysis Model (k = 92; method: REML)
## 
##   logLik  Deviance       AIC       BIC      AICc 
## -40.8178   81.6355   89.6355   99.6790   90.1006   
## 
## Variance Components:
## 
##             estim    sqrt  nlvls  fixed    factor 
## sigma^2.1  0.0316  0.1777     30     no  Study_ID 
## sigma^2.2  0.0229  0.1513     92     no     ES_ID 
## sigma^2.3  0.0030  0.0544      6     no    Strain 
## 
## Test for Heterogeneity:
## Q(df = 91) = 303.2179, p-val < .0001
## 
## Model Results:
## 
## estimate      se    tval  df    pval   ci.lb   ci.ub 
##   0.1229  0.0596  2.0605  91  0.0422  0.0044  0.2414  * 
## 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
i2_ml(mod_ES0) 
##    I2_total I2_Study_ID    I2_ES_ID   I2_Strain 
##  0.81703063  0.44913873  0.32576306  0.04212884
orchard_plot(mod_ES0, mod = "Int", xlab = "lnRR", alpha=0.4) + 
  geom_errorbarh(aes(xmin = lowerPR, xmax = upperPR), height = 0, show.legend = FALSE, size = 1.1, alpha = 0.5) + # prediction intervals
  geom_errorbarh(aes(xmin = lowerCL, xmax = upperCL), height = 0.05, show.legend = FALSE, size = 2) + # confidence intervals
  geom_point(aes(fill = name),  size = 5, shape = 21)+ # mean estimate
  scale_size_continuous(range = c(1, 7))+ # change point scaling
  theme(panel.border = element_rect(colour = "black", fill=NA, size=1.3), # border around the plot
        text = element_text(size = 24), # change font sizes
        legend.title = element_text(size = 15),
        legend.text = element_text(size = 13)) 

Meta-regression: uni-moderator

Type of assay

VCV_ES1 <- impute_covariance_matrix(vi = dat1$lnRRV_ES, cluster = dat$Study_ID, r = 0.5)

mod_ES1 <- rma.mv(yi = lnRR_ESa, V = VCV_ES1, mod = ~Type_assay-1, random = list(~1|Study_ID,
                                                                                    ~1|ES_ID,
                                                                                    ~1|Strain),
                  test = "t",
                  data = dat1)

summary(mod_ES1)
## 
## Multivariate Meta-Analysis Model (k = 92; method: REML)
## 
##   logLik  Deviance       AIC       BIC      AICc 
## -39.0874   78.1748   90.1748  105.1066   91.1992   
## 
## Variance Components:
## 
##             estim    sqrt  nlvls  fixed    factor 
## sigma^2.1  0.0370  0.1924     30     no  Study_ID 
## sigma^2.2  0.0192  0.1386     92     no     ES_ID 
## sigma^2.3  0.0018  0.0422      6     no    Strain 
## 
## Test for Residual Heterogeneity:
## QE(df = 89) = 293.9385, p-val < .0001
## 
## Test of Moderators (coefficients 1:3):
## F(df1 = 3, df2 = 89) = 3.1062, p-val = 0.0305
## 
## Model Results:
## 
##                         estimate      se     tval  df    pval    ci.lb   ci.ub 
## Type_assayConditioning    0.1525  0.0589   2.5877  89  0.0113   0.0354  0.2696 
## Type_assayHabituation     0.1990  0.1415   1.4070  89  0.1629  -0.0820  0.4801 
## Type_assayRecognition    -0.0048  0.0800  -0.0606  89  0.9518  -0.1637  0.1541 
##  
## Type_assayConditioning  * 
## Type_assayHabituation 
## Type_assayRecognition 
## 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
r2_ml(mod_ES1) 
##   R2_marginal R2_coditional 
##    0.05775809    0.97105550
Learning_ES <- orchard_plot(mod_ES1, mod = "Type_assay", xlab = "lnRR", alpha=0.4) + 
  geom_errorbarh(aes(xmin = lowerPR, xmax = upperPR), height = 0, show.legend = FALSE, size = 1.1, alpha = 0.5) + # prediction intervals
  geom_errorbarh(aes(xmin = lowerCL, xmax = upperCL), height = 0.05, show.legend = FALSE, size = 2) + # confidence intervals
  geom_point(aes(fill = name),  size = 3, shape = 21)+ # mean estimate
  scale_size_continuous(range = c(1, 7))+ # change point scaling
  theme(panel.border = element_rect(colour = "black", fill=NA, size=1.3), # border around the plot
        axis.text.x = element_text(size = 10), # change font sizes
        axis.text.y = element_text(size = 10),
        legend.title = element_text(size = 7),
        legend.text = element_text(size = 7)) 

Learning_ES

Learning vs Memory

mod_ES2 <-  rma.mv(yi = lnRR_ESa, V = VCV_ES, mod = ~Learning_vs_memory-1, random = list(~1|Study_ID, 
                                                                                           ~1|ES_ID,
                                                                                           ~1|Strain),
                   test = "t",
                   data = dat)

summary(mod_ES2) 
## 
## Multivariate Meta-Analysis Model (k = 92; method: REML)
## 
##   logLik  Deviance       AIC       BIC      AICc 
## -40.4769   80.9539   90.9539  103.4529   91.6682   
## 
## Variance Components:
## 
##             estim    sqrt  nlvls  fixed    factor 
## sigma^2.1  0.0292  0.1708     30     no  Study_ID 
## sigma^2.2  0.0232  0.1524     92     no     ES_ID 
## sigma^2.3  0.0034  0.0582      6     no    Strain 
## 
## Test for Residual Heterogeneity:
## QE(df = 90) = 299.1854, p-val < .0001
## 
## Test of Moderators (coefficients 1:2):
## F(df1 = 2, df2 = 90) = 2.9219, p-val = 0.0590
## 
## Model Results:
## 
##                             estimate      se    tval  df    pval    ci.lb 
## Learning_vs_memoryLearning    0.1744  0.0722  2.4166  90  0.0177   0.0310 
## Learning_vs_memoryMemory      0.1057  0.0619  1.7065  90  0.0914  -0.0174 
##                              ci.ub 
## Learning_vs_memoryLearning  0.3178  * 
## Learning_vs_memoryMemory    0.2288  . 
## 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
r2_ml(mod_ES2) 
##   R2_marginal R2_coditional 
##     0.0197648     0.9405080
LvsM_ES <- orchard_plot(mod_ES2, mod = "Learning_vs_memory", xlab = "lnRR", alpha=0.4) + 
  geom_errorbarh(aes(xmin = lowerPR, xmax = upperPR), height = 0, show.legend = FALSE, size = 1.1, alpha = 0.5) + # prediction intervals
  geom_errorbarh(aes(xmin = lowerCL, xmax = upperCL), height = 0.05, show.legend = FALSE, size = 2) + # confidence intervals
  geom_point(aes(fill = name),  size = 3, shape = 21)+ # mean estimate
  scale_size_continuous(range = c(1, 7))+ # change point scaling
  theme(panel.border = element_rect(colour = "black", fill=NA, size=1.3), # border around the plot
        axis.text.x = element_text(size = 10), # change font sizes
        axis.text.y = element_text(size = 10),
        legend.title = element_text(size = 7),
        legend.text = element_text(size = 7)) 

LvsM_ES 

Type of reinforcement

VCV_ES2 <- impute_covariance_matrix(vi = dat2$lnRRV_ES, cluster = dat2$Study_ID, r = 0.5)

mod_ES3 <- rma.mv(yi = lnRR_ESa, V = VCV_ES2, mod = ~ Type_reinforcement-1, random = list(~1|Study_ID,
                                                                                               ~1|ES_ID,
                                                                                               ~1|Strain),
                  test = "t",
                  data = dat2)

summary(mod_ES3)
## 
## Multivariate Meta-Analysis Model (k = 92; method: REML)
## 
##   logLik  Deviance       AIC       BIC      AICc 
## -39.0604   78.1208   90.1208  105.0526   91.1452   
## 
## Variance Components:
## 
##             estim    sqrt  nlvls  fixed    factor 
## sigma^2.1  0.0382  0.1954     30     no  Study_ID 
## sigma^2.2  0.0189  0.1377     92     no     ES_ID 
## sigma^2.3  0.0000  0.0000      6     no    Strain 
## 
## Test for Residual Heterogeneity:
## QE(df = 89) = 293.4724, p-val < .0001
## 
## Test of Moderators (coefficients 1:3):
## F(df1 = 3, df2 = 89) = 3.2547, p-val = 0.0254
## 
## Model Results:
## 
##                                   estimate      se    tval  df    pval    ci.lb 
## Type_reinforcementAppetitive        0.1007  0.1075  0.9366  89  0.3515  -0.1129 
## Type_reinforcementAversive          0.1573  0.0569  2.7618  89  0.0070   0.0441 
## Type_reinforcementNot applicable    0.0147  0.0702  0.2101  89  0.8341  -0.1247 
##                                    ci.ub 
## Type_reinforcementAppetitive      0.3143     
## Type_reinforcementAversive        0.2704  ** 
## Type_reinforcementNot applicable  0.1541     
## 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
r2_ml(mod_ES3) 
##   R2_marginal R2_coditional 
##     0.0586952     1.0000000
Reinforcement_ES <- orchard_plot(mod_ES3, mod = "Type_reinforcement", xlab = "lnRR", alpha=0.4) + 
  geom_errorbarh(aes(xmin = lowerPR, xmax = upperPR), height = 0, show.legend = FALSE, size = 1.1, alpha = 0.5) + # prediction intervals
  geom_errorbarh(aes(xmin = lowerCL, xmax = upperCL), height = 0.05, show.legend = FALSE, size = 2) + # confidence intervals
  geom_point(aes(fill = name),  size = 3, shape = 21)+ # mean estimate
  scale_size_continuous(range = c(1, 7))+ # change point scaling
  theme(panel.border = element_rect(colour = "black", fill=NA, size=1.3), # border around the plot
        axis.text.x = element_text(size = 10), # change font sizes
        axis.text.y = element_text(size = 10),
        legend.title = element_text(size = 7),
        legend.text = element_text(size = 7)) 

Reinforcement_ES 

Type of stress

VCV_ES3 <- impute_covariance_matrix(vi = dat3$lnRRV_ES, cluster = dat3$Study_ID, r = 0.5)
mod_ES4 <- rma.mv(yi = lnRR_ESa, V = VCV_ES3, mod = ~Type_stress_exposure-1, random = list(~1|Study_ID,
                                                                                            ~1|ES_ID,
                                                                                            ~1|Strain),
                  test = "t",
                  data = dat3)
summary(mod_ES4)
## 
## Multivariate Meta-Analysis Model (k = 85; method: REML)
## 
##   logLik  Deviance       AIC       BIC      AICc 
## -34.4046   68.8091   82.8091   99.5703   84.3434   
## 
## Variance Components:
## 
##             estim    sqrt  nlvls  fixed    factor 
## sigma^2.1  0.0426  0.2064     25     no  Study_ID 
## sigma^2.2  0.0232  0.1524     85     no     ES_ID 
## sigma^2.3  0.0104  0.1021      4     no    Strain 
## 
## Test for Residual Heterogeneity:
## QE(df = 81) = 281.9708, p-val < .0001
## 
## Test of Moderators (coefficients 1:4):
## F(df1 = 4, df2 = 81) = 0.5137, p-val = 0.7258
## 
## Model Results:
## 
##                                  estimate      se    tval  df    pval    ci.lb 
## Type_stress_exposureCombination    0.1111  0.1458  0.7618  81  0.4484  -0.1790 
## Type_stress_exposureMS             0.1185  0.1099  1.0784  81  0.2840  -0.1001 
## Type_stress_exposureNoise          0.1651  0.1795  0.9198  81  0.3604  -0.1920 
## Type_stress_exposureRestraint      0.1374  0.1252  1.0978  81  0.2755  -0.1116 
##                                   ci.ub 
## Type_stress_exposureCombination  0.4011    
## Type_stress_exposureMS           0.3370    
## Type_stress_exposureNoise        0.5221    
## Type_stress_exposureRestraint    0.3865    
## 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
r2_ml(mod_ES4)
##   R2_marginal R2_coditional 
##   0.004455703   0.863910284
Stressor_ES <- orchard_plot(mod_ES4, mod = "Type_stress_exposure", xlab = "lnRR", alpha=0.4) + 
  geom_errorbarh(aes(xmin = lowerPR, xmax = upperPR), height = 0, show.legend = FALSE, size = 1.1, alpha = 0.5) + # prediction intervals
  geom_errorbarh(aes(xmin = lowerCL, xmax = upperCL), height = 0.05, show.legend = FALSE, size = 2) + # confidence intervals
  geom_point(aes(fill = name),  size = 3, shape = 21)+ # mean estimate
  scale_size_continuous(range = c(1, 7))+ # change point scaling
  theme(panel.border = element_rect(colour = "black", fill=NA, size=1.3), # border around the plot
        axis.text.x = element_text(size = 10), # change font sizes
        axis.text.y = element_text(size = 10),
        legend.title = element_text(size = 7),
        legend.text = element_text(size = 7))  

Stressor_ES 

Age of stress

mod_ES5 <-rma.mv(yi = lnRR_ESa, V = VCV_ES, mod = ~Age_stress_exposure-1, random = list(~1|Study_ID,
                                                                                          ~1|ES_ID,
                                                                                          ~1|Strain),
                 test = "t",
                 data = dat)
summary(mod_ES5) 
## 
## Multivariate Meta-Analysis Model (k = 92; method: REML)
## 
##   logLik  Deviance       AIC       BIC      AICc 
## -39.0917   78.1834   92.1834  109.5247   93.5834   
## 
## Variance Components:
## 
##             estim    sqrt  nlvls  fixed    factor 
## sigma^2.1  0.0295  0.1718     30     no  Study_ID 
## sigma^2.2  0.0232  0.1522     92     no     ES_ID 
## sigma^2.3  0.0091  0.0954      6     no    Strain 
## 
## Test for Residual Heterogeneity:
## QE(df = 88) = 286.4225, p-val < .0001
## 
## Test of Moderators (coefficients 1:4):
## F(df1 = 4, df2 = 88) = 1.5932, p-val = 0.1832
## 
## Model Results:
## 
##                                     estimate      se     tval  df    pval 
## Age_stress_exposureAdolescent        -0.0137  0.1762  -0.0775  88  0.9384 
## Age_stress_exposureAdult              0.1677  0.1140   1.4708  88  0.1449 
## Age_stress_exposureEarly postnatal    0.1067  0.0920   1.1602  88  0.2491 
## Age_stress_exposurePrenatal           0.3179  0.1311   2.4254  88  0.0173 
##                                       ci.lb   ci.ub 
## Age_stress_exposureAdolescent       -0.3639  0.3366    
## Age_stress_exposureAdult            -0.0589  0.3942    
## Age_stress_exposureEarly postnatal  -0.0761  0.2896    
## Age_stress_exposurePrenatal          0.0574  0.5784  * 
## 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
r2_ml(mod_ES5) 
##   R2_marginal R2_coditional 
##    0.09276574    0.86630830
Age_stress_ES<-orchard_plot(mod_ES5, mod = "Age_stress_exposure", xlab = "lnRR", alpha=0.4) + 
  geom_errorbarh(aes(xmin = lowerPR, xmax = upperPR), height = 0, show.legend = FALSE, size = 1.1, alpha = 0.5) + # prediction intervals
  geom_errorbarh(aes(xmin = lowerCL, xmax = upperCL), height = 0.05, show.legend = FALSE, size = 2) + # confidence intervals
  geom_point(aes(fill = name),  size = 3, shape = 21)+ # mean estimate
  scale_size_continuous(range = c(1, 7))+ # change point scaling
  theme(panel.border = element_rect(colour = "black", fill=NA, size=1.3), # border around the plot
       axis.text.x = element_text(size = 10), # change font sizes
        axis.text.y = element_text(size = 10),
        legend.title = element_text(size = 7),
        legend.text = element_text(size = 7)) 

Age_stress_ES

Stress duration

VCV_ES4 <- impute_covariance_matrix(vi = dat4$lnRRV_ES, cluster = dat4$Study_ID, r = 0.5)

mod_ES6 <-rma.mv(yi = lnRR_ESa, V = VCV_ES4, mod = ~Stress_duration-1, random = list(~1|Study_ID,
                                                                                      ~1|ES_ID,
                                                                                      ~1|Strain),
                 test = "t",
                 data = dat4)
summary(mod_ES6) 
## 
## Multivariate Meta-Analysis Model (k = 89; method: REML)
## 
##   logLik  Deviance       AIC       BIC      AICc 
## -35.9010   71.8020   81.8020   94.1315   82.5427   
## 
## Variance Components:
## 
##             estim    sqrt  nlvls  fixed    factor 
## sigma^2.1  0.0133  0.1155     29     no  Study_ID 
## sigma^2.2  0.0260  0.1611     89     no     ES_ID 
## sigma^2.3  0.0080  0.0895      6     no    Strain 
## 
## Test for Residual Heterogeneity:
## QE(df = 87) = 278.4877, p-val < .0001
## 
## Test of Moderators (coefficients 1:2):
## F(df1 = 2, df2 = 87) = 4.3877, p-val = 0.0153
## 
## Model Results:
## 
##                         estimate      se     tval  df    pval    ci.lb   ci.ub 
## Stress_durationAcute     -0.0367  0.0930  -0.3946  87  0.6941  -0.2216  0.1482 
## Stress_durationChronic    0.1854  0.0732   2.5347  87  0.0130   0.0400  0.3308 
##  
## Stress_durationAcute 
## Stress_durationChronic  * 
## 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
r2_ml(mod_ES6) 
##   R2_marginal R2_coditional 
##     0.1598311     0.8575918
Duration_ES<- orchard_plot(mod_ES6, mod = "Stress_duration", xlab = "lnRR", alpha=0.4) + 
  geom_errorbarh(aes(xmin = lowerPR, xmax = upperPR), height = 0, show.legend = FALSE, size = 1.1, alpha = 0.5) + # prediction intervals
  geom_errorbarh(aes(xmin = lowerCL, xmax = upperCL), height = 0.05, show.legend = FALSE, size = 2) + # confidence intervals
  geom_point(aes(fill = name),  size = 3, shape = 21)+ # mean estimate
  scale_size_continuous(range = c(1, 7))+ # change point scaling
  theme(panel.border = element_rect(colour = "black", fill=NA, size=1.3), # border around the plot
        axis.text.x = element_text(size = 10), # change font sizes
        axis.text.y = element_text(size = 10),
        legend.title = element_text(size = 7),
        legend.text = element_text(size = 7)) 

Duration_ES

Social enrichment

VCV_ES5 <- impute_covariance_matrix(vi = dat5$lnRRV_ES, cluster = dat5$Study_ID, r = 0.5)
mod_ES7<- rma.mv(yi = lnRR_ESa, V = VCV_ES5, mod = ~EE_social-1, random = list(~1|Study_ID,
                                                                                ~1|ES_ID,
                                                                                ~1|Strain),
                 test = "t",
                 data = dat5)

summary(mod_ES7)
## 
## Multivariate Meta-Analysis Model (k = 92; method: REML)
## 
##   logLik  Deviance       AIC       BIC      AICc 
## -40.1871   80.3742   90.3742  102.8733   91.0885   
## 
## Variance Components:
## 
##             estim    sqrt  nlvls  fixed    factor 
## sigma^2.1  0.0311  0.1762     30     no  Study_ID 
## sigma^2.2  0.0230  0.1518     92     no     ES_ID 
## sigma^2.3  0.0046  0.0676      6     no    Strain 
## 
## Test for Residual Heterogeneity:
## QE(df = 90) = 302.0860, p-val < .0001
## 
## Test of Moderators (coefficients 1:2):
## F(df1 = 2, df2 = 90) = 2.4198, p-val = 0.0947
## 
## Model Results:
## 
##                      estimate      se    tval  df    pval    ci.lb   ci.ub 
## EE_socialNon-social    0.0750  0.0807  0.9300  90  0.3549  -0.0853  0.2353    
## EE_socialSocial        0.1720  0.0788  2.1842  90  0.0315   0.0156  0.3285  * 
## 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
r2_ml(mod_ES7) 
##   R2_marginal R2_coditional 
##    0.03751906    0.92501263
Social_ES <- orchard_plot(mod_ES7, mod = "EE_social", xlab = "lnRR", alpha=0.4) + 
  geom_errorbarh(aes(xmin = lowerPR, xmax = upperPR), height = 0, show.legend = FALSE, size = 1.1, alpha = 0.5) + # prediction intervals
  geom_errorbarh(aes(xmin = lowerCL, xmax = upperCL), height = 0.05, show.legend = FALSE, size = 2) + # confidence intervals
  geom_point(aes(fill = name),  size = 3, shape = 21)+ # mean estimate
  scale_size_continuous(range = c(1, 7))+ # change point scaling
  theme(panel.border = element_rect(colour = "black", fill=NA, size=1.3), # border around the plot
        axis.text.x = element_text(size = 10), # change font sizes
        axis.text.y = element_text(size = 10),
        legend.title = element_text(size = 7),
        legend.text = element_text(size = 7)) 

Social_ES

Exercise enrichment

mod_ES8<- rma.mv(yi = lnRR_ESa, V = VCV_ES, mod = ~EE_exercise-1, random = list(~1|Study_ID, 
    ~1|ES_ID,
    ~1|Strain),
     test = "t",
     data = dat)

summary(mod_ES8)
## 
## Multivariate Meta-Analysis Model (k = 92; method: REML)
## 
##   logLik  Deviance       AIC       BIC      AICc 
## -40.4968   80.9935   90.9935  103.4926   91.7078   
## 
## Variance Components:
## 
##             estim    sqrt  nlvls  fixed    factor 
## sigma^2.1  0.0325  0.1803     30     no  Study_ID 
## sigma^2.2  0.0230  0.1517     92     no     ES_ID 
## sigma^2.3  0.0065  0.0805      6     no    Strain 
## 
## Test for Residual Heterogeneity:
## QE(df = 90) = 297.3270, p-val < .0001
## 
## Test of Moderators (coefficients 1:2):
## F(df1 = 2, df2 = 90) = 1.8401, p-val = 0.1647
## 
## Model Results:
## 
##                         estimate      se    tval  df    pval    ci.lb   ci.ub 
## EE_exerciseExercise       0.1051  0.0780  1.3474  90  0.1812  -0.0499  0.2602 
## EE_exerciseNo exercise    0.1687  0.0967  1.7448  90  0.0844  -0.0234  0.3609 
##  
## EE_exerciseExercise 
## EE_exerciseNo exercise  . 
## 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
r2_ml(mod_ES8) 
##   R2_marginal R2_coditional 
##    0.01474459    0.89712469
Exercise_ES <- orchard_plot(mod_ES8, mod = "EE_exercise", xlab = "lnRR", alpha=0.4) + 
  geom_errorbarh(aes(xmin = lowerPR, xmax = upperPR), height = 0, show.legend = FALSE, size = 1.1, alpha = 0.5) + # prediction intervals
  geom_errorbarh(aes(xmin = lowerCL, xmax = upperCL), height = 0.05, show.legend = FALSE, size = 2) + # confidence intervals
  geom_point(aes(fill = name),  size = 3, shape = 21)+ # mean estimate
  scale_size_continuous(range = c(1, 7))+ # change point scaling
  theme(panel.border = element_rect(colour = "black", fill=NA, size=1.3), # border around the plot
       axis.text.x = element_text(size = 10), # change font sizes
        axis.text.y = element_text(size = 10),
        legend.title = element_text(size = 7),
        legend.text = element_text(size = 7)) 

Exercise_ES

Order to treatment exposure

mod_ES9 <- rma.mv(yi = lnRR_ESa, V = VCV_ES, mod = ~Exposure_order -1, random = list(~1|Study_ID, 
    ~1|ES_ID,
    ~1|Strain),
     test = "t",
     data = dat)

summary(mod_ES9)
## 
## Multivariate Meta-Analysis Model (k = 92; method: REML)
## 
##   logLik  Deviance       AIC       BIC      AICc 
## -39.0408   78.0817   90.0817  105.0135   91.1061   
## 
## Variance Components:
## 
##             estim    sqrt  nlvls  fixed    factor 
## sigma^2.1  0.0316  0.1777     30     no  Study_ID 
## sigma^2.2  0.0227  0.1507     92     no     ES_ID 
## sigma^2.3  0.0000  0.0000      6     no    Strain 
## 
## Test for Residual Heterogeneity:
## QE(df = 89) = 292.2561, p-val < .0001
## 
## Test of Moderators (coefficients 1:3):
## F(df1 = 3, df2 = 89) = 3.1546, p-val = 0.0287
## 
## Model Results:
## 
##                                 estimate      se     tval  df    pval    ci.lb 
## Exposure_orderConcurrently        0.1492  0.1208   1.2351  89  0.2201  -0.0909 
## Exposure_orderEnrichment first   -0.1782  0.1659  -1.0744  89  0.2856  -0.5079 
## Exposure_orderStress first        0.1370  0.0526   2.6046  89  0.0108   0.0325 
##                                  ci.ub 
## Exposure_orderConcurrently      0.3893    
## Exposure_orderEnrichment first  0.1514    
## Exposure_orderStress first      0.2414  * 
## 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
r2_ml(mod_ES9)
##   R2_marginal R2_coditional 
##     0.1027207     1.0000000
Order_ES <- orchard_plot(mod_ES9, mod = "Exposure_order", xlab = "lnRR", alpha=0.4) + 
  geom_errorbarh(aes(xmin = lowerPR, xmax = upperPR), height = 0, show.legend = FALSE, size = 1.1, alpha = 0.5) + # prediction intervals
  geom_errorbarh(aes(xmin = lowerCL, xmax = upperCL), height = 0.05, show.legend = FALSE, size = 2) + # confidence intervals
  geom_point(aes(fill = name),  size = 3, shape = 21)+ # mean estimate
  scale_size_continuous(range = c(1, 7))+ # change point scaling
  theme(panel.border = element_rect(colour = "black", fill=NA, size=1.3), # border around the plot
        axis.text.x = element_text(size = 10), # change font sizes
        axis.text.y = element_text(size = 10),
        legend.title = element_text(size = 7),
        legend.text = element_text(size = 7)) 

Order_ES 

Age of enrichment

VCV_ES6 <- impute_covariance_matrix(vi = dat6$lnRRV_ES, cluster = dat6$Study_ID, r = 0.5)

mod_ES10 <- rma.mv(yi = lnRR_ESa, V = VCV_ES6, mod = ~Age_EE_exposure-1, random = list(~1|Study_ID,
                                                                                    ~1|ES_ID,
                                                                                    ~1|Strain),
                 test = "t",
                 data = dat6)

summary(mod_ES10) 
## 
## Multivariate Meta-Analysis Model (k = 88; method: REML)
## 
##   logLik  Deviance       AIC       BIC      AICc 
## -36.6407   73.2813   83.2813   95.5531   84.0313   
## 
## Variance Components:
## 
##             estim    sqrt  nlvls  fixed    factor 
## sigma^2.1  0.0332  0.1822     29     no  Study_ID 
## sigma^2.2  0.0207  0.1439     88     no     ES_ID 
## sigma^2.3  0.0007  0.0265      6     no    Strain 
## 
## Test for Residual Heterogeneity:
## QE(df = 86) = 288.6493, p-val < .0001
## 
## Test of Moderators (coefficients 1:2):
## F(df1 = 2, df2 = 86) = 3.1308, p-val = 0.0487
## 
## Model Results:
## 
##                            estimate      se    tval  df    pval    ci.lb 
## Age_EE_exposureAdolescent    0.1284  0.0583  2.2006  86  0.0304   0.0124 
## Age_EE_exposureAdult         0.1247  0.0921  1.3538  86  0.1793  -0.0584 
##                             ci.ub 
## Age_EE_exposureAdolescent  0.2444  * 
## Age_EE_exposureAdult       0.3077    
## 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
r2_ml(mod_ES10) 
##   R2_marginal R2_coditional 
##  0.0000400928  0.9871095822
Age_enrichment_ES <- orchard_plot(mod_ES10, mod = "Age_EE_exposure", xlab = "lnRR", alpha=0.4) + 
  geom_errorbarh(aes(xmin = lowerPR, xmax = upperPR), height = 0, show.legend = FALSE, size = 1.1, alpha = 0.5) + # prediction intervals
  geom_errorbarh(aes(xmin = lowerCL, xmax = upperCL), height = 0.05, show.legend = FALSE, size = 2) + # confidence intervals
  geom_point(aes(fill = name),  size = 3, shape = 21)+ # mean estimate
  scale_size_continuous(range = c(1, 7))+ # change point scaling
  theme(panel.border = element_rect(colour = "black", fill=NA, size=1.3), # border around the plot
       axis.text.x = element_text(size = 10), # change font sizes
        axis.text.y = element_text(size = 10),
        legend.title = element_text(size = 7),
        legend.text = element_text(size = 7)) 

Age_enrichment_ES

Multi-moderator model

dat_ESfm <- dat %>%
  filter(Type_assay %in% c("Recognition", "Habituation", "Conditioning"),
         Type_reinforcement %in% c("Appetitive", "Aversive", "Not applicable"),
         EE_social %in% c("Social", "Non-social"),
         Age_EE_exposure %in% c("Adult", "Adolescent"),
         Type_stress_exposure %in% c("Restraint", "Noise", "MS", "Combination"),
         Stress_duration %in% c("Chronic", "Acute"), 
         Age_stress_exposure %in% c("Prenatal", "Early postnatal", "Adult"))

VCV_ESfm <- impute_covariance_matrix(vi = dat_ESfm$lnRRV_ES, cluster = dat_ESfm$Study_ID, r = 0.5)
                 
mod_ESfm <- rma.mv(yi = lnRR_Sa, V = VCV_ESfm, mod = ~Type_assay-1 + Learning_vs_memory + Type_reinforcement + EE_social + EE_exercise + Age_EE_exposure + Type_stress_exposure + Age_stress_exposure + Stress_duration + Exposure_order, random =   list(~1|Study_ID,
                                                                                    ~1|ES_ID,
                                                                                    ~1|Strain),
                    test = "t",
                 data = dat_ESfm)
#summary(mod_ESfm)
#r2_ml(mod_ESfm) 


res_ESfm <- dredge(mod_ESfm, trace=2)
saveRDS(res_ESfm, file = here("Rdata", "res_ESfm.rds"))
# also saving the full model and data
saveRDS(mod_ESfm, file = here("Rdata", "mod_ESfm.rds"))
saveRDS(dat_ESfm, file = here("Rdata", "dat_ESfm.rds"))
dat_ESfm <- readRDS(file = here("Rdata", "dat_ESfm.rds"))
mod_ESfm <- readRDS(file = here("Rdata", "mod_ESfm.rds"))
res_ESfm <- readRDS(file = here("Rdata", "res_ESfm.rds"))
res_ESfm2<- subset(res_ESfm, delta <= 6, recalc.weights=FALSE)
importance(res_ESfm2) 
##                      Type_assay Stress_duration Age_EE_exposure EE_exercise
## Sum of weights:      0.65       0.63            0.26            0.11       
## N containing models:   19         18               7               6       
##                      Learning_vs_memory EE_social Age_stress_exposure
## Sum of weights:      0.08               0.08      0.05               
## N containing models:    4                  4         2               
##                      Type_stress_exposure Exposure_order
## Sum of weights:      0.03                 0.02          
## N containing models:    2                    1

Publication bias & sensitivity analysis

Publication bias

Funnel_ES<-funnel(mod_ESfm, xlab = "lnRR", ylab = "Standard Error")

Funnel_ES
#year published was scaled previously under stress PB

dat_ESfm$sqrt_inv_e_n <- with(dat_ESfm, sqrt(1/CC_n + 1/EC_n + 1/ES_n + 1/CS_n))

PB_MR_ES<- rma.mv(lnRR_ESa, lnRRV_ES, mods = ~1 + sqrt_inv_e_n +  Year_published + Learning_vs_memory + Type_assay + Type_reinforcement + EE_social + EE_exercise + Age_stress_exposure, random = list(~1|Study_ID,
                                                          ~1|ES_ID,
                                                          ~1|Strain), method = "REML", test = "t", 
    data = dat_ESfm)

estimates_PB_MR_ES<- estimates.CI(PB_MR_ES)
#estimates_PB_MR_ES

Leave-one-out analysis

dat$Study_ID <- as.factor(dat$Study_ID)

LeaveOneOut_effectsize <- list()
for(i in 1:length(levels(dat$Study_ID))){
  LeaveOneOut_effectsize[[i]] <- rma.mv(yi = lnRR_Ea, V = lnRRV_E, 
                                        random = list(~1 | Study_ID,~1| ES_ID, ~1 | Strain), 
                                        method = "REML", data = dat[dat$Study_ID
                                                                    != levels(dat$Study_ID)[i], ])}


# writing function for extracting est, ci.lb, and ci.ub from all models
est.func <- function(mod_E0){
  df <- data.frame(est = mod_E0$b, lower = mod_E0$ci.lb, upper = mod_E0$ci.ub)
  return(df)
}


#using dplyr to form data frame
MA_CVR_ES <- lapply(LeaveOneOut_effectsize, function(x) est.func(x))%>% bind_rows %>% mutate(left_out = levels(dat$Study_ID))

saveRDS(MA_CVR_ES, ,file = here("Rdata", "MA_CVR_ES.rds"))
MA_CVR_ES<- readRDS(here("Rdata", "MA_CVR_ES.rds"))

#telling ggplot to stop reordering factors
MA_CVR_ES$left_out<- as.factor(MA_CVR_ES$left_out)
MA_CVR_ES$left_out<-factor(MA_CVR_ES$left_out, levels = MA_CVR_ES$left_out)

#plotting
leaveoneout_ES <- ggplot(MA_CVR_ES) +
  geom_hline(yintercept = 0, lty = 2, lwd = 1) +
  geom_hline(yintercept = mod_E0$ci.lb, lty = 3, lwd = 0.75, colour = "black") +
  geom_hline(yintercept = mod_E0$b, lty = 1, lwd = 0.75, colour = "black") +
  geom_hline(yintercept = mod_E0$ci.ub, lty = 3, lwd = 0.75, colour = "black") +
  geom_pointrange(aes(x = left_out, y = est, ymin = lower, ymax = upper)) +
  xlab("Study left out") + 
  ylab("lnRR, 95% CI") + 
  coord_flip() +
  theme(panel.grid.minor = element_blank())+
  theme_bw() + theme(panel.grid.major = element_blank()) +
  theme(panel.grid.minor.x = element_blank() ) +
  theme(axis.text.y = element_text(size = 6))

leaveoneout_ES

dat$Study_ID <- as.integer(dat$Study_ID)

Combined orchard plot

mod_list1 <- list(mod_E0, mod_S0, mod_ES0)

mod_res1 <- lapply(mod_list1, function(x) mod_results(x, mod = "Int"))

merged1 <- submerge(mod_res1[[3]], mod_res1[[2]],  mod_res1[[1]], mix = T)
merged1$mod_table$name <- factor(merged1$mod_table$name, levels = c("Intrcpt1", 
    "Intrcpt2", "Intrcpt3"), 
    labels = rev(c("Enrichment ME", "Stress ME", "Interaction")))

merged1$data$moderator <- factor(merged1$data$moderator, levels = c("Intrcpt1", 
    "Intrcpt2", "Intrcpt3"), 
    labels = rev(c("Enrichment ME", "Stress ME", "Interaction")))

orchard1<- orchard_plot(merged1, mod = "Int", xlab = "lnRR", angle = 0) + 
  geom_errorbarh(aes(xmin = lowerPR, xmax = upperPR), height = 0, show.legend = FALSE, size = 1.1, alpha = 0.5) + # prediction intervals
  geom_errorbarh(aes(xmin = lowerCL, xmax = upperCL), height = 0.05, show.legend = FALSE, size = 2) + # confidence intervals 
  xlim(-2,4.5) +
  geom_point(aes(fill = name),  size = 4, shape = 21)+ # mean estimate
  scale_size_continuous(range = c(1, 7))+ # change point scaling +
  scale_colour_manual(values = c("#00AEEF","#00A651","#ED1C24"))+ # change colours
  scale_fill_manual(values=c("#00AEEF","#00A651","#ED1C24"))+
  theme(panel.border = element_rect(colour = "black", fill=NA, size=1.3), # border around the plot
        text = element_text(size = 15), # change font sizes
        legend.title = element_text(size = 10),
        legend.text = element_text(size = 10)) 

orchard1

‘Pairwise’ effect sizes

Enrichment relative to control

VCV_E20 <- impute_covariance_matrix(vi = dat$lnRRV_E2, cluster = dat$Study_ID, r = 0.5)

mod_E20 <- rma.mv(yi = lnRR_E2a, V = VCV_E20, random = list(~1|Study_ID,
                                                             ~ 1|Strain,
                                                             ~1|ES_ID),
                 test = "t", 
                 data = dat, 
                 control=list(optimizer="optim", optmethod="Nelder-Mead"))

summary(mod_E20) 
## 
## Multivariate Meta-Analysis Model (k = 92; method: REML)
## 
##   logLik  Deviance       AIC       BIC      AICc 
##  -7.3235   14.6470   22.6470   32.6904   23.1121   
## 
## Variance Components:
## 
##             estim    sqrt  nlvls  fixed    factor 
## sigma^2.1  0.0037  0.0611     30     no  Study_ID 
## sigma^2.2  0.0000  0.0000      6     no    Strain 
## sigma^2.3  0.0281  0.1675     92     no     ES_ID 
## 
## Test for Heterogeneity:
## Q(df = 91) = 475.8327, p-val < .0001
## 
## Model Results:
## 
## estimate      se    tval  df    pval   ci.lb   ci.ub 
##   0.1066  0.0291  3.6655  91  0.0004  0.0489  0.1644  *** 
## 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
i2_ml(mod_E20) 
##     I2_total  I2_Study_ID    I2_Strain     I2_ES_ID 
## 8.610789e-01 1.011724e-01 2.607945e-09 7.599065e-01
orchard_plot(mod_E20, mod = "Int", xlab = "lnRR")

Stress relative to control

VCV_S20 <- impute_covariance_matrix(vi = dat$lnRRV_S2, cluster = dat$Study_ID, r = 0.5)

mod_S20 <- rma.mv(yi = lnRR_S2a, V = VCV_S20, random = list(~1|Study_ID, 
                                                             ~ 1|Strain,
                                                             ~1|ES_ID),
                 test = "t",
                 data = dat)

summary(mod_S20) 
## 
## Multivariate Meta-Analysis Model (k = 92; method: REML)
## 
##   logLik  Deviance       AIC       BIC      AICc 
## -52.3561  104.7122  112.7122  122.7557  113.1773   
## 
## Variance Components:
## 
##             estim    sqrt  nlvls  fixed    factor 
## sigma^2.1  0.0323  0.1797     30     no  Study_ID 
## sigma^2.2  0.0000  0.0000      6     no    Strain 
## sigma^2.3  0.0798  0.2824     92     no     ES_ID 
## 
## Test for Heterogeneity:
## Q(df = 91) = 1003.0694, p-val < .0001
## 
## Model Results:
## 
## estimate      se     tval  df    pval    ci.lb    ci.ub 
##  -0.1846  0.0522  -3.5360  91  0.0006  -0.2882  -0.0809  *** 
## 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
i2_ml(mod_S20) 
##     I2_total  I2_Study_ID    I2_Strain     I2_ES_ID 
## 9.489604e-01 2.734220e-01 9.879730e-10 6.755384e-01
orchard_plot(mod_S20, mod = "Int", xlab = "lnRR")

Enrichment + stress relative to control

VCV_ES20 <- impute_covariance_matrix(vi = dat$lnRRV_ES2, cluster = dat$Study_ID, r = 0.5)

mod_ES20 <- rma.mv(yi = lnRR_ES2a, V = VCV_ES20, random = list(~1|Study_ID,
                                                                ~ 1|Strain,
                                                                ~1|ES_ID),
                 test = "t",
                 data = dat)
summary(mod_ES20) 
## 
## Multivariate Meta-Analysis Model (k = 92; method: REML)
## 
##   logLik  Deviance       AIC       BIC      AICc 
## -10.3625   20.7250   28.7250   38.7684   29.1901   
## 
## Variance Components:
## 
##             estim    sqrt  nlvls  fixed    factor 
## sigma^2.1  0.0039  0.0625     30     no  Study_ID 
## sigma^2.2  0.0014  0.0377      6     no    Strain 
## sigma^2.3  0.0227  0.1508     92     no     ES_ID 
## 
## Test for Heterogeneity:
## Q(df = 91) = 402.2656, p-val < .0001
## 
## Model Results:
## 
## estimate      se    tval  df    pval   ci.lb   ci.ub 
##   0.0801  0.0389  2.0594  91  0.0423  0.0028  0.1573  * 
## 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
i2_ml(mod_ES20) 
##    I2_total I2_Study_ID   I2_Strain    I2_ES_ID 
##  0.81513970  0.11355557  0.04132363  0.66026050
orchard_plot(mod_ES20, mod = "Int", xlab = "lnRR")

Enrichment + stress relative to stress

VCV_E30 <- impute_covariance_matrix(vi = dat$lnRRV_E3, cluster = dat$Study_ID, r = 0.5)

mod_E30 <- rma.mv(yi = lnRR_E3a, V = VCV_E30, random = list(~1|Study_ID,
                                                             ~ 1|Strain,
                                                             ~1|ES_ID),
                  test = "t",
                  data = dat)
summary(mod_E30) 
## 
## Multivariate Meta-Analysis Model (k = 92; method: REML)
## 
##   logLik  Deviance       AIC       BIC      AICc 
## -46.3447   92.6895  100.6895  110.7329  101.1546   
## 
## Variance Components:
## 
##             estim    sqrt  nlvls  fixed    factor 
## sigma^2.1  0.0235  0.1532     30     no  Study_ID 
## sigma^2.2  0.0263  0.1623      6     no    Strain 
## sigma^2.3  0.0543  0.2331     92     no     ES_ID 
## 
## Test for Heterogeneity:
## Q(df = 91) = 790.0249, p-val < .0001
## 
## Model Results:
## 
## estimate      se    tval  df    pval   ci.lb   ci.ub 
##   0.2465  0.1011  2.4389  91  0.0167  0.0457  0.4472  * 
## 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
i2_ml(mod_E30) 
##    I2_total I2_Study_ID   I2_Strain    I2_ES_ID 
##   0.9456920   0.2132063   0.2391809   0.4933048
orchard_plot(mod_E30, mod = "Int", xlab = "lnRR")

Enrichment + stress relative to enrichment

VCV_S30 <- impute_covariance_matrix(vi = dat$lnRRV_S3, cluster = dat$Study_ID, r = 0.5)

mod_S30 <- rma.mv(yi = lnRR_S3a, V = VCV_S30, random = list(~1|Study_ID,
                                                             ~ 1|Strain,
                                                             ~1|ES_ID),
                  test = "t",
                  data = dat,
                   control=list(optimizer="optim", optmethod="Nelder-Mead"))
summary(mod_S30) 
## 
## Multivariate Meta-Analysis Model (k = 92; method: REML)
## 
##   logLik  Deviance       AIC       BIC      AICc 
##  -6.8788   13.7576   21.7576   31.8011   22.2228   
## 
## Variance Components:
## 
##             estim    sqrt  nlvls  fixed    factor 
## sigma^2.1  0.0000  0.0000     30     no  Study_ID 
## sigma^2.2  0.0009  0.0292      6     no    Strain 
## sigma^2.3  0.0276  0.1662     92     no     ES_ID 
## 
## Test for Heterogeneity:
## Q(df = 91) = 540.3522, p-val < .0001
## 
## Model Results:
## 
## estimate      se     tval  df    pval    ci.lb   ci.ub 
##  -0.0087  0.0342  -0.2552  91  0.7992  -0.0766  0.0592    
## 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
i2_ml(mod_S30) 
##     I2_total  I2_Study_ID    I2_Strain     I2_ES_ID 
## 8.415428e-01 5.192043e-09 2.515933e-02 8.163835e-01
orchard_plot(mod_S30, mod = "Int", xlab = "lnRR")

mod_list2 <- list(mod_S30, mod_E30, mod_ES20, mod_S20, mod_E20) #rearranged the order so that it matches intext results

mod_res2 <- lapply(mod_list2, function(x) mod_results(x, mod = "Int"))

merged2 <- submerge(mod_res2[[1]], mod_res2[[2]],  mod_res2[[3]], mod_res2[[4]],  mod_res2[[5]], mix = T)

merged2$mod_table$name <- factor(merged2$mod_table$name, levels = c("Intrcpt1", 
    "Intrcpt2", "Intrcpt3", "Intrcpt4", "Intrcpt5"), 
    labels = rev(c("EC/CC", "CS/CC", "ES/CC", "ES/CS", "ES/EC")))

merged2$data$moderator <- factor(merged2$data$moderator, levels = c("Intrcpt1", 
    "Intrcpt2", "Intrcpt3", "Intrcpt4", "Intrcpt5"), 
    labels = rev(c("EC/CC", "CS/CC", "ES/CC", "ES/CS", "ES/EC")))

orchard2 <- orchard_plot(merged2, mod = "Int", xlab = "lnRR", angle = 0) + 
  geom_errorbarh(aes(xmin = lowerPR, xmax = upperPR), height = 0, show.legend = FALSE, size = 1.1, alpha = 0.5) + # prediction intervals
  geom_errorbarh(aes(xmin = lowerCL, xmax = upperCL), height = 0.05, show.legend = FALSE, size = 2) + # confidence intervals 
  xlim(-2,4.5) +
  geom_point(aes(fill = name),  size = 4, shape = 21)+ # mean estimate
  scale_size_continuous(range = c(1, 7))+ # change point scaling
  scale_colour_manual(values = c("#7B81BE","#D7DF23","#F37158","#75CBF2","#97D2B4"))+ # change colours
  scale_fill_manual(values=c("#7B81BE","#D7DF23","#F37158","#75CBF2","#97D2B4"))+
  theme(panel.border = element_rect(colour = "black", fill=NA, size=1.3), # border around the plot
        text = element_text(size = 15), # change font sizes
        legend.title = element_text(size = 10),
        legend.text = element_text(size = 10)) 

Figures

Panel of ‘focal’ ES and ‘pairwise’ ES orchard plots

p1 <- orchard1 + orchard2 +  plot_annotation(tag_levels = 'A')
p1

#saved as PDF: 6 x 15 inches

Panel of meta-regressions

Environmental enrichment

#Enrichment
E_mod <- (LvsM_E + Learning_E + Reinforcement_E)/ (Age_E + Exercise_E + Social_E) +  plot_annotation(tag_levels = 'A')

E_mod

#saved as pdf 10 x 15 inches

Stress

S_mod <- (LvsM_S + Learning_S + Reinforcement_S) / (Age_S + Stressor + Duration_S) + plot_annotation(tag_levels = 'A')

S_mod

#saved as pdf 10 x 15 inches

Interaction

ES_mod <- plot_grid(LvsM_ES, Learning_ES, Reinforcement_ES, Age_enrichment_ES, Age_stress_ES, Order_ES, Exercise_ES, Social_ES, Stressor_ES, Duration_ES,
  labels = "AUTO", ncol = 5)

ES_mod

#saved as 10 x 20 inches

Panel of funnel plots

# EE

pdf(NULL)
dev.control(displaylist="enable")
par(mar=c(4,4,0.1,0))
A <- funnel(mod_Sfm, xlab = "Residuals (lnRR)", ylab = "Standard Error",
        xlim = c(-2,2),
        ylim = c(0,1.05))
A <- recordPlot()
invisible(dev.off())

# Stress

pdf(NULL)
dev.control(displaylist="enable")
par(mar=c(4,4,0.1,0))
B <- funnel(mod_Sfm, xlab = "Residuals (lnRR)", ylab = "Standard Error",
        xlim = c(-2,2),
        ylim = c(0,1.05))
B <- recordPlot()
invisible(dev.off())

# Interaction
pdf(NULL)
dev.control(displaylist="enable")
par(mar=c(4,4,0.1,0))
C <- funnel(mod_ESfm, xlab = "Residuals (lnRR)", ylab = "Standard Error",
        xlim = c(-2,2),
        ylim = c(0,1.05))
C <- recordPlot()
invisible(dev.off())
# putting together
ggdraw(A) + ggdraw(B) + ggdraw(C) + plot_annotation(tag_levels = 'A')

#png(file = here("figs", "Fig7_Funnels.png"))
 
#dev.off()
#knitr::include_graphics(here("figs", "funnels.png"))

Modelling with SMD

Environmental Enrichment

Meta-analysis

mod_E0a <- rma.mv(yi = SMD_Ea, V = VCV_Ea, random = list(~1|Study_ID,
                                                         ~1|ES_ID, 
                                                         ~1|Strain),
                 test = "t",
                 data = dat)
summary(mod_E0a)
## 
## Multivariate Meta-Analysis Model (k = 92; method: REML)
## 
##    logLik   Deviance        AIC        BIC       AICc 
## -111.6284   223.2568   231.2568   241.3003   231.7220   
## 
## Variance Components:
## 
##             estim    sqrt  nlvls  fixed    factor 
## sigma^2.1  0.2512  0.5012     30     no  Study_ID 
## sigma^2.2  0.4247  0.6517     92     no     ES_ID 
## sigma^2.3  0.0000  0.0000      6     no    Strain 
## 
## Test for Heterogeneity:
## Q(df = 91) = 673.4722, p-val < .0001
## 
## Model Results:
## 
## estimate      se    tval  df    pval   ci.lb   ci.ub 
##   0.7241  0.1295  5.5895  91  <.0001  0.4668  0.9814  *** 
## 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
i2_ml(mod_E0a)
##     I2_total  I2_Study_ID     I2_ES_ID    I2_Strain 
## 8.673320e-01 3.223202e-01 5.450118e-01 1.749563e-09

Stress

Meta-analysis

mod_S0a <- rma.mv(yi = SMD_Sa, V = VCV_Sa, random = list(~1|Study_ID,
                                                         ~1|ES_ID,
                                                         ~1|Strain),
                test = "t",
                data = dat)
summary(mod_S0a) 
## 
## Multivariate Meta-Analysis Model (k = 92; method: REML)
## 
##    logLik   Deviance        AIC        BIC       AICc 
## -120.2817   240.5634   248.5634   258.6068   249.0285   
## 
## Variance Components:
## 
##             estim    sqrt  nlvls  fixed    factor 
## sigma^2.1  0.3874  0.6224     30     no  Study_ID 
## sigma^2.2  0.4969  0.7049     92     no     ES_ID 
## sigma^2.3  0.0000  0.0000      6     no    Strain 
## 
## Test for Heterogeneity:
## Q(df = 91) = 818.5592, p-val < .0001
## 
## Model Results:
## 
## estimate      se     tval  df    pval    ci.lb    ci.ub 
##  -0.4256  0.1498  -2.8403  91  0.0056  -0.7232  -0.1279  ** 
## 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
i2_ml(mod_S0a) 
##     I2_total  I2_Study_ID     I2_ES_ID    I2_Strain 
## 8.959540e-01 3.924790e-01 5.034750e-01 1.438454e-09

Interaction

Meta-analysis

mod_ES0a <- rma.mv(yi = SMD_ESa, V = VCV_ESa, random = list(~1|Study_ID,
                                                            ~1|ES_ID,
                                                            ~1|Strain),
                  test = "t",
                  data = dat)
summary(mod_ES0a)
## 
## Multivariate Meta-Analysis Model (k = 92; method: REML)
## 
##    logLik   Deviance        AIC        BIC       AICc 
## -126.0571   252.1141   260.1141   270.1576   260.5793   
## 
## Variance Components:
## 
##             estim    sqrt  nlvls  fixed    factor 
## sigma^2.1  0.4653  0.6821     30     no  Study_ID 
## sigma^2.2  0.3698  0.6081     92     no     ES_ID 
## sigma^2.3  0.0000  0.0002      6     no    Strain 
## 
## Test for Heterogeneity:
## Q(df = 91) = 257.4673, p-val < .0001
## 
## Model Results:
## 
## estimate      se    tval  df    pval   ci.lb   ci.ub 
##   0.6880  0.1763  3.9017  91  0.0002  0.3377  1.0382  *** 
## 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
i2_ml(mod_ES0a) 
##     I2_total  I2_Study_ID     I2_ES_ID    I2_Strain 
## 6.657130e-01 3.709364e-01 2.947766e-01 3.351907e-08

Risk of Bias

Percent of studies that used randomisation and used blinding

# randomisation
dat %>% group_by(ROB_randomisation) %>% 
  summarise(n = n_distinct(Study_ID))
## # A tibble: 2 x 2
##   ROB_randomisation     n
##   <chr>             <int>
## 1 Unclear              15
## 2 Yes                  15
15/30
## [1] 0.5
#blinding
dat %>% group_by(ROB_blinding) %>% 
  summarise(n = n_distinct(Study_ID))
## # A tibble: 2 x 2
##   ROB_blinding     n
##   <chr>        <int>
## 1 Unclear         24
## 2 Yes              6
6/30
## [1] 0.2
LS0tCnRpdGxlOiAiRW5yaWNobWVudCB4IHN0cmVzcyBNQSIKYXV0aG9yczogIkVyaW4gTCBNYWNhcnRuZXksIE1hbGdvcnphdGEgTGFnaXN6LCBTaGluaWNoaSBOYWthZ2F3YSIKc3VidGl0bGU6IFN1cHBsZW1lbnRhcnkgTWF0ZXJpYWwKb3V0cHV0OiAKICAgIAogICAgcm1kZm9ybWF0czo6cmVhZHRoZWRvd246CiAgICAgIGNvZGVfZm9sZGluZzogaGlkZQogICAgICBjb2RlX2Rvd25sb2FkOiB0cnVlCmVkaXRvcl9vcHRpb25zOiAKICBjaHVua19vdXRwdXRfdHlwZTogY29uc29sZQogICMgb3V0cHV0OgojICAgaHRtbF9kb2N1bWVudDoKIyAgICAgY29kZV9mb2xkaW5nOiBoaWRlCiMgICAgIGRmX3ByaW50OiBrYWJsZQojICAgICB0b2M6IFRSVUUKIyAgICAgdG9jX2Zsb2F0OiBUUlVFCiMgICAgIHRvY19kZXB0aDogNAojICAgICBjb2xsYXBzZWQ6IEZBTFNFCiMgICAgIFlBTUw6IHJtZGZvcm1hdHM6OnJvYm9ib29rCi0tLQoKYGBge3IsIGluY2x1ZGUgPSBGQUxTRX0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KAptZXNzYWdlID0gRkFMU0UsCndhcm5pbmcgPSBGQUxTRSwKY2FjaGUgPSBUUlVFLCAKdGlkeSA9IFRSVUUsIAplY2hvID0gVFJVRQopCgpybShsaXN0ID0gbHMoKSkKYGBgCgojIFNldHRpbmctdXAKCiMjIExvYWRpbmcgcGFja2FnZXMKCmBgYHtyfQoKI2RldnRvb2xzOjppbnN0YWxsX2dpdGh1YignTWlrYXRhLVByb2plY3QvZ2d0aGVtcicsIGZvcmNlID0gVFJVRSkgCgpwYWNtYW46OnBfbG9hZCh0aWR5dmVyc2UsIAogICAgICAgICAgICAgICBoZXJlLAogICAgICAgICAgICAgICBtZXRhZm9yLAogICAgICAgICAgICAgICBjbHViU2FuZHdpY2gsCiAgICAgICAgICAgICAgIG9yY2hhUmQsIAogICAgICAgICAgICAgICBNdU1JbiwgCiAgICAgICAgICAgICAgIHBhdGNod29yaywKICAgICAgICAgICAgICAgR29vZG1hbktydXNrYWwsCiAgICAgICAgICAgICAgIG5ldHdvcmtEMywKICAgICAgICAgICAgICAgZ2dwbG90MiwKICAgICAgICAgICAgICAgdmlzZGF0LAogICAgICAgICAgICAgICBnZ2FsbHV2aWFsLAogICAgICAgICAgICAgICBnZ3RoZW1yLCAKICAgICAgICAgICAgICAgY293cGxvdCwKICAgICAgICAgICAgICAgZ3JEZXZpY2VzLAogICAgICAgICAgICAgICBwbmcsCiAgICAgICAgICAgICAgIGdyaWQsCiAgICAgICAgICAgICAgIGdyaWRHcmFwaGljcykKIyBuZWVkZWQgZm9yIG1vZGVsIHNlbGVjdGlvbiB1c2luZyBNdU1JbiB3aXRoaW4gbWV0YWZvcgpldmFsKG1ldGFmb3I6OjouTXVNSW4pCgpgYGAKCiMjIExvYWRpbmcgZGF0YSBhbmQgZnVuY3Rpb25zCgpgYGB7cn0KZGF0IDwtIHJlYWRfY3N2KGhlcmUoIkRhdGEiLCJEYXRhX3Jhdy5jc3YiKSkKIyBMb2FkIGN1c3RvbSBmdW5jdGlvbiB0byBleHRyYWN0IGRhdGEgCnNvdXJjZShoZXJlKCJSL0Z1bmN0aW9ucy5SIikpIApgYGAKIyBEYXRhIG9yZ2FuaXNhdGlvbgpSZW1vdmluZyBzdHVkeSB3aXRoIG5lZ2F0aXZlIHZhbHVlcywgcm91bmRpbmcgZG93biBzYW1wbGUgc2l6ZXMsZ2V0dGluZyBlZmZlY3Qgc2l6ZXMgZnJvbSBmdW5jdGlvbiwgJ2ZsaXBwaW5nJyBlZmZlY3Qgc2l6ZXMgc28gdGhhdCBhbGwgZWZmZWN0IHNpemVzIGFyZSBoaWdoZXIgdmFsdWVzID0gaW5kaXZpZHVhbHMgZG8gYmV0dGVyIGFuZCBsZWFybmluZy9tZW1vcnksIGFzc2lnbmluZyBodW1hbiByZWFkYWJsZSB0ZXJtcywgYW5kIGNyZWF0aW5nIFZDViBvZiB2YXJpYW5jZSAKCmBgYHtyfQoKIyByZW1vdmluZyBzdHVkeSB3aXRoIG5lZ2F0aXZlIHZhbHVlcyBhcyB0aGVzZSBhcmUgdW5hYmxlIHRvIGJlIHVzZWQgZm9yIGxuUlIKZGF0IDwtIGRyb3BsZXZlbHMoZGF0WyFkYXQkRmlyc3RfYXV0aG9yID09ICdXYW5nJyxdKQoKI3JvdW5kaW5nIGRvd24gc2FtcGxlIHNpemVzCmRhdCRDQ19uIDwtIGZsb29yKGRhdCRDQ19uKQpkYXQkRUNfbiA8LSBmbG9vcihkYXQkRUNfbikKZGF0JENTX24gPC0gZmxvb3IoZGF0JENTX24pCmRhdCRFU19uIDwtIGZsb29yKGRhdCRDU19uKQoKIyAnRm9jYWwnIGVmZmVjdF9zaXplIAplZmZlY3Rfc2l6ZSA8LSB3aXRoKGRhdCwgbWFwcGx5KGVmZmVjdF9zZXQsIAogICAgICAgICAgICAgICAgICAgICAgQ0NfbiAsCiAgICAgICAgICAgICAgICAgICAgICBDQ19tZWFuLCAKICAgICAgICAgICAgICAgICAgICAgIENDX1NELAogICAgICAgICAgICAgICAgICAgICAgRUNfbiwgCiAgICAgICAgICAgICAgICAgICAgICBFQ19tZWFuLCAKICAgICAgICAgICAgICAgICAgICAgIEVDX1NELAogICAgICAgICAgICAgICAgICAgICAgQ1NfbiwgCiAgICAgICAgICAgICAgICAgICAgICBDU19tZWFuLCAKICAgICAgICAgICAgICAgICAgICAgIENTX1NELAogICAgICAgICAgICAgICAgICAgICAgRVNfbiwgCiAgICAgICAgICAgICAgICAgICAgICBFU19tZWFuLCAKICAgICAgICAgICAgICAgICAgICAgIEVTX1NELAogICAgICAgICAgICAgICAgICAgICAgcGVyY2VudCA9IFJlc3BvbnNlX3BlcmNlbnQsCiAgICAgICAgICAgICAgICAgICAgICBTSU1QTElGWSA9IEZBTFNFKSkKZWZmZWN0X3NpemUgPC0gbWFwX2RmcihlZmZlY3Rfc2l6ZSwgSSkKCiMgJ1BhaXJ3aXNlJyBlZmZlY3Qgc2l6ZQogZWZmZWN0X3NpemUyIDwtIHdpdGgoZGF0LCBtYXBwbHkoZWZmZWN0X3NldDIsIAogICAgICAgICAgICAgICAgICAgICAgQ0NfbiAsCiAgICAgICAgICAgICAgICAgICAgICBDQ19tZWFuLCAKICAgICAgICAgICAgICAgICAgICAgIENDX1NELAogICAgICAgICAgICAgICAgICAgICAgRUNfbiwgCiAgICAgICAgICAgICAgICAgICAgICBFQ19tZWFuLCAKICAgICAgICAgICAgICAgICAgICAgIEVDX1NELAogICAgICAgICAgICAgICAgICAgICAgQ1NfbiwgCiAgICAgICAgICAgICAgICAgICAgICBDU19tZWFuLCAKICAgICAgICAgICAgICAgICAgICAgIENTX1NELAogICAgICAgICAgICAgICAgICAgICAgRVNfbiwgCiAgICAgICAgICAgICAgICAgICAgICBFU19tZWFuLCAKICAgICAgICAgICAgICAgICAgICAgIEVTX1NELAogICAgICAgICAgICAgICAgICAgICAgcGVyY2VudCA9IFJlc3BvbnNlX3BlcmNlbnQsCiAgICAgICAgICAgICAgICAgICAgICBTSU1QTElGWSA9IEZBTFNFKSkKZWZmZWN0X3NpemUyIDwtIG1hcF9kZnIoZWZmZWN0X3NpemUyLCBJKQoKZnVsbF9pbmZvIDwtIHdoaWNoKGNvbXBsZXRlLmNhc2VzKGVmZmVjdF9zaXplKSA9PSBUUlVFKQoKIyBhZGRpbmcgZWZmZWN0IHNpemVzIGFzIGNvbHVtbgpkYXQgPC0gYmluZF9jb2xzKGRhdCwgZWZmZWN0X3NpemUsIGVmZmVjdF9zaXplMikKZGF0IDwtIGRhdFtmdWxsX2luZm8sIF0KCiNGbGlwcGluZyAnbG93ZXIgaXMgYmV0dGVyJyBlZmZlY3Qgc2l6ZXMKI2ZsaXBwaW5nIGxuUlIgZm9yIHZhbHVlcyB3aGVyZSBoaWdoZXIgPSB3b3JzZQpkYXQkbG5SUl9FYSA8LSBpZmVsc2UoZGF0JFJlc3BvbnNlX2RpcmVjdGlvbiA9PSAyLCBkYXQkbG5SUl9FKi0xLGlmZWxzZShpcy5uYShkYXQkUmVzcG9uc2VfZGlyZWN0aW9uKSA9PSBUUlVFLCBOQSwgZGF0JGxuUlJfRSkpCiMgY3VycmVudGx5IE5Bc3doaWNoIGNhdXNlcyBlcnJvcgpkYXQkbG5SUl9TYSAgPC0gaWZlbHNlKGRhdCRSZXNwb25zZV9kaXJlY3Rpb24gPT0gMiwgZGF0JGxuUlJfUyotMSxpZmVsc2UoaXMubmEoZGF0JFJlc3BvbnNlX2RpcmVjdGlvbikgPT0gVFJVRSwgTkEsIGRhdCRsblJSX1MpKSAjIGN1cnJlbnRseSBOQXN3aGljaCBjYXVzZXMgZXJyb3IKZGF0JGxuUlJfRVNhIDwtICBpZmVsc2UoZGF0JFJlc3BvbnNlX2RpcmVjdGlvbiA9PSAyLCBkYXQkbG5SUl9FUyotMSxpZmVsc2UoaXMubmEoZGF0JFJlc3BvbnNlX2RpcmVjdGlvbikgPT0gVFJVRSwgTkEsIGRhdCRsblJSX0VTKSkgIyBjdXJyZW50bHkgTkFzd2hpY2ggY2F1c2VzIGVycm9yCiNmbGlwcGluZyAncHVyZSBlZmZlY3Qgc2l6ZXMnCmRhdCRsblJSX0UyYSA8LSBpZmVsc2UoZGF0JFJlc3BvbnNlX2RpcmVjdGlvbiA9PSAyLCBkYXQkbG5SUl9FMiotMSxpZmVsc2UoaXMubmEoZGF0JFJlc3BvbnNlX2RpcmVjdGlvbikgPT0gVFJVRSwgTkEsIGRhdCRsblJSX0UyKSkgIyBjdXJyZW50bHkgTkFzd2hpY2ggY2F1c2VzIGVycm9yCmRhdCRsblJSX1MyYSAgPC0gaWZlbHNlKGRhdCRSZXNwb25zZV9kaXJlY3Rpb24gPT0gMiwgZGF0JGxuUlJfUzIqLTEsaWZlbHNlKGlzLm5hKGRhdCRSZXNwb25zZV9kaXJlY3Rpb24pID09IFRSVUUsIE5BLCBkYXQkbG5SUl9TMikpICMgY3VycmVudGx5IE5Bc3doaWNoIGNhdXNlcyBlcnJvcgpkYXQkbG5SUl9FUzJhIDwtICBpZmVsc2UoZGF0JFJlc3BvbnNlX2RpcmVjdGlvbiA9PSAyLCBkYXQkbG5SUl9FUzIqLTEsaWZlbHNlKGlzLm5hKGRhdCRSZXNwb25zZV9kaXJlY3Rpb24pID09IFRSVUUsIE5BLCBkYXQkbG5SUl9FUzIpKSAjIGN1cnJlbnRseSBOQXN3aGljaCBjYXVzZXMgZXJyb3IKZGF0JGxuUlJfRTNhIDwtICBpZmVsc2UoZGF0JFJlc3BvbnNlX2RpcmVjdGlvbiA9PSAyLCBkYXQkbG5SUl9FMyotMSxpZmVsc2UoaXMubmEoZGF0JFJlc3BvbnNlX2RpcmVjdGlvbikgPT0gVFJVRSwgTkEsIGRhdCRsblJSX0UzKSkgIyBjdXJyZW50bHkgTkFzd2hpY2ggY2F1c2VzIGVycm9yCmRhdCRsblJSX1MzYSA8LSAgaWZlbHNlKGRhdCRSZXNwb25zZV9kaXJlY3Rpb24gPT0gMiwgZGF0JGxuUlJfUzMqLTEsaWZlbHNlKGlzLm5hKGRhdCRSZXNwb25zZV9kaXJlY3Rpb24pID09IFRSVUUsIE5BLCBkYXQkbG5SUl9TMykpICMgY3VycmVudGx5IE5Bc3doaWNoIGNhdXNlcyBlcnJvcgoKI2ZsaXBwaW5nIFNNRApkYXQkU01EX0VhIDwtIGlmZWxzZShkYXQkUmVzcG9uc2VfZGlyZWN0aW9uID09IDIsIGRhdCRTTURfRSotMSxpZmVsc2UoaXMubmEoZGF0JFJlc3BvbnNlX2RpcmVjdGlvbikgPT0gVFJVRSwgTkEsIGRhdCRTTURfRSkpICMgY3VycmVudGx5IE5Bc3doaWNoIGNhdXNlcyBlcnJvcgpkYXQkU01EX1NhICA8LSBpZmVsc2UoZGF0JFJlc3BvbnNlX2RpcmVjdGlvbiA9PSAyLCBkYXQkU01EX1MqLTEsaWZlbHNlKGlzLm5hKGRhdCRSZXNwb25zZV9kaXJlY3Rpb24pID09IFRSVUUsIE5BLCBkYXQkU01EX1MpKSAjIGN1cnJlbnRseSBOQXN3aGljaCBjYXVzZXMgZXJyb3IKZGF0JFNNRF9FU2EgPC0gIGlmZWxzZShkYXQkUmVzcG9uc2VfZGlyZWN0aW9uID09IDIsIGRhdCRTTURfRVMqLTEsaWZlbHNlKGlzLm5hKGRhdCRSZXNwb25zZV9kaXJlY3Rpb24pID09IFRSVUUsIE5BLCBkYXQkU01EX0VTKSkKCiMgYXNzaWduaW5nIGh1bWFuIHJlYWRhYmxlIHRlcm1zCmRhdCA8LSBkYXQgJT4lIG11dGF0ZShUeXBlX2Fzc2F5ID0gY2FzZV93aGVuKFR5cGVfYXNzYXkgPT0gMSB+ICJIYWJpdHVhdGlvbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFR5cGVfYXNzYXkgPT0gMiB+ICJDb25kaXRpb25pbmciLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUeXBlX2Fzc2F5ID09IDMgfiAiUmVjb2duaXRpb24iLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHlwZV9hc3NheSA9PSA0IH4gIlVuY2xlYXIiKSwKICAgICAgICAgICAgICAgICAgICAgIExlYXJuaW5nX3ZzX21lbW9yeSA9IGNhc2Vfd2hlbihMZWFybmluZ192c19tZW1vcnkgPT0gMSB+ICJMZWFybmluZyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGVhcm5pbmdfdnNfbWVtb3J5ID09IDIgfiAiTWVtb3J5IiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGVhcm5pbmdfdnNfbWVtb3J5ID09IDMgfiAiSGFiaXR1YXRpb24iKSwKICAgICAgICAgICAgICAgICAgICAgIFR5cGVfcmVpbmZvcmNlbWVudCA9IGNhc2Vfd2hlbihUeXBlX3JlaW5mb3JjZW1lbnQ9PSAxIH4iQXBwZXRpdGl2ZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFR5cGVfcmVpbmZvcmNlbWVudD09IDIgfiAiQXZlcnNpdmUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUeXBlX3JlaW5mb3JjZW1lbnQ9PSAzIH4gIk5vdCBhcHBsaWNhYmxlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHlwZV9yZWluZm9yY2VtZW50PT0gNCB+ICJVbmNsZWFyIiksCiAgICAgICAgICAgICAgICAgICAgICBUeXBlX3N0cmVzc19leHBvc3VyZSA9IGNhc2Vfd2hlbihUeXBlX3N0cmVzc19leHBvc3VyZSA9PSAxIH4gIkRlbnNpdHkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHlwZV9zdHJlc3NfZXhwb3N1cmUgPT0gMiB+ICJTY2VudCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUeXBlX3N0cmVzc19leHBvc3VyZSA9PSAzIH4gIlNob2NrIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFR5cGVfc3RyZXNzX2V4cG9zdXJlID09IDQgfiAiRXhlcnRpb24iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHlwZV9zdHJlc3NfZXhwb3N1cmUgPT0gNSB+ICJSZXN0cmFpbnQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHlwZV9zdHJlc3NfZXhwb3N1cmUgPT0gNiB+ICJNUyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUeXBlX3N0cmVzc19leHBvc3VyZSA9PSA3IH4gIkNpcmNhZGlhbiByaHl0aG0iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHlwZV9zdHJlc3NfZXhwb3N1cmUgPT0gOCB+ICJOb2lzZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUeXBlX3N0cmVzc19leHBvc3VyZSA9PSA5IH4gIk90aGVyIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFR5cGVfc3RyZXNzX2V4cG9zdXJlID09IDEwIH4gIkNvbWJpbmF0aW9uIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFR5cGVfc3RyZXNzX2V4cG9zdXJlID09IDExIH4gInVuY2xlYXIiKSwgCiAgICAgICAgICAgICAgICAgICAgICBBZ2Vfc3RyZXNzX2V4cG9zdXJlID0gY2FzZV93aGVuKEFnZV9zdHJlc3NfZXhwb3N1cmUgPT0gMSB+ICJQcmVuYXRhbCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFnZV9zdHJlc3NfZXhwb3N1cmUgPT0gMiB+ICJFYXJseSBwb3N0bmF0YWwiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBZ2Vfc3RyZXNzX2V4cG9zdXJlID09IDMgfiAiQWRvbGVzY2VudCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFnZV9zdHJlc3NfZXhwb3N1cmUgPT0gNCB+ICJBZHVsdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFnZV9zdHJlc3NfZXhwb3N1cmUgPT0gNSB+ICJVbmNsZWFyIiksCiAgICAgICAgICAgICAgICAgICAgICBTdHJlc3NfZHVyYXRpb24gPSBjYXNlX3doZW4oU3RyZXNzX2R1cmF0aW9uID09IDEgfiAiQWN1dGUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmVzc19kdXJhdGlvbiA9PSAyIH4gIkNocm9uaWMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmVzc19kdXJhdGlvbiA9PSAzIH4gIkludGVybWl0dGVudCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyZXNzX2R1cmF0aW9uID09IDQgfiAiVW5jbGVhciIpLAogICAgICAgICAgICAgICAgICAgICAgRUVfc29jaWFsID0gY2FzZV93aGVuKEVFX3NvY2lhbCA9PSAxIH4gIlNvY2lhbCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUVfc29jaWFsPT0gMiB+ICJOb24tc29jaWFsIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUVfc29jaWFsID09IDMgfiAiVW5jbGVhciIpLCAKICAgICAgICAgICAgICAgICAgICAgIEVFX2V4ZXJjaXNlID0gY2FzZV93aGVuKEVFX2V4ZXJjaXNlID09IDEgfiAiRXhlcmNpc2UiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVFX2V4ZXJjaXNlID09IDIgfiAiTm8gZXhlcmNpc2UiKSwKICAgICAgICAgICAgICAgICAgICAgIEFnZV9FRV9leHBvc3VyZSA9IGNhc2Vfd2hlbihBZ2VfRUVfZXhwb3N1cmUgPT0gMSB+ICJQcmVuYXRhbCIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFnZV9FRV9leHBvc3VyZSA9PSAyIH4gIkVhcmx5IHBvc3RuYXRhbCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWdlX0VFX2V4cG9zdXJlID09IDMgfiAiQWRvbGVzY2VudCIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFnZV9FRV9leHBvc3VyZSA9PSA0IH4gIkFkdWx0IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBZ2VfRUVfZXhwb3N1cmUgPT0gNSB+ICJVbmNsZWFyIiksCiAgICAgICAgICAgICAgICAgICAgICBFeHBvc3VyZV9vcmRlciA9IGNhc2Vfd2hlbihFeHBvc3VyZV9vcmRlciA9PSAxIH4gIlN0cmVzcyBmaXJzdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV4cG9zdXJlX29yZGVyID09IDIgfiAiRW5yaWNobWVudCBmaXJzdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV4cG9zdXJlX29yZGVyID09IDMgfiAiQ29uY3VycmVudGx5IiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV4cG9zdXJlX29yZGVyID09IDQgfiAiVW5jbGVhciIpLAogICAgICAgICAgICAgICAgICAgICAgQWdlX2Fzc2F5ID0gY2FzZV93aGVuKEFnZV9hc3NheSA9PSAxIH4gIkVhcmx5IHBvc3RuYXRhbCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWdlX2Fzc2F5ID09IDIgfiAiQWRvbGVzY2VudCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWdlX2Fzc2F5ID09IDMgfiAiQWR1bHQiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBZ2VfYXNzYXkgPT0gNCB+ICJVbmNsZWFyIiksCiAgICAgICAgICAgICAgICAgICAgICBTZXggPSBjYXNlX3doZW4oU2V4ID09IDEgfiAiRmVtYWxlIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2V4ID09IDIgfiAiTWFsZSIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNleCA9PSAzIH4gIk1peGVkIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2V4ID09IDQgfiAiVW5jbGVhciIpLAogICAgICAgICAgICAgICAgICAgICAgVHlwZV9FRV9leHBvc3VyZSA9IGNhc2Vfd2hlbihUeXBlX0VFX2V4cG9zdXJlID09IDEgfiAiTmVzdGluZyBtYXRlcmlhbCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFR5cGVfRUVfZXhwb3N1cmUgPT0gMiB+ICJPYmplY3RzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHlwZV9FRV9leHBvc3VyZSA9PSAzIH4gIkNhZ2UgY29tcGxleGl0eSIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUeXBlX0VFX2V4cG9zdXJlID09IDQgfiAiV2hlZWwvdHJhZGVtaWxsIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHlwZV9FRV9leHBvc3VyZSA9PSA1IH4gIkNvbWJpbmF0aW9uIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHlwZV9FRV9leHBvc3VyZSA9PSA2IH4gIk90aGVyIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFR5cGVfRUVfZXhwb3N1cmUgPT0gNyB+ICJVbmNsZWFyIiksCiAgICAgICAgICAgICAgICAgICAgICBST0JfYmxpbmRpbmcgPSBjYXNlX3doZW4oUk9CX2JsaW5kaW5nID09IDEgfiAiWWVzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBST0JfYmxpbmRpbmcgPT0gMiB+ICJObyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUk9CX2JsaW5kaW5nID09IDMgfiAiVW5jbGVhciIpLAogICAgICAgICAgICAgICAgICAgICAgUk9CX3JhbmRvbWlzYXRpb24gPSBjYXNlX3doZW4oUk9CX3JhbmRvbWlzYXRpb24gPT0gMSB+ICJZZXMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUk9CX3JhbmRvbWlzYXRpb24gPT0gMiB+ICJObyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBST0JfcmFuZG9taXNhdGlvbiA9PSAzIH4gIlVuY2xlYXIiKSkKCiNtYWtpbmcgdmFyaWFuY2UgVkNWcwpWQ1ZfRSA8LSBpbXB1dGVfY292YXJpYW5jZV9tYXRyaXgodmkgPSBkYXQkbG5SUlZfRSwgY2x1c3RlciA9IGRhdCRTdHVkeV9JRCwgciA9IDAuNSkKVkNWX1MgPC0gaW1wdXRlX2NvdmFyaWFuY2VfbWF0cml4KHZpID0gZGF0JGxuUlJWX1MsIGNsdXN0ZXIgPSBkYXQkU3R1ZHlfSUQsIHIgPSAwLjUpClZDVl9FUyA8LSBpbXB1dGVfY292YXJpYW5jZV9tYXRyaXgodmkgPSBkYXQkbG5SUlZfRVMsIGNsdXN0ZXIgPSBkYXQkU3R1ZHlfSUQsIHIgPSAwLjUpCgpWQ1ZfRWEgPC0gaW1wdXRlX2NvdmFyaWFuY2VfbWF0cml4KHZpID0gZGF0JFNNRFZfRSwgY2x1c3RlciA9IGRhdCRTdHVkeV9JRCwgciA9IDAuNSkKVkNWX1NhIDwtIGltcHV0ZV9jb3ZhcmlhbmNlX21hdHJpeCh2aSA9IGRhdCRTTURWX1MsIGNsdXN0ZXIgPSBkYXQkU3R1ZHlfSUQsIHIgPSAwLjUpClZDVl9FU2EgPC0gaW1wdXRlX2NvdmFyaWFuY2VfbWF0cml4KHZpID0gZGF0JFNNRFZfRVMsIGNsdXN0ZXIgPSBkYXQkU3R1ZHlfSUQsIHIgPSAwLjUpCgojd3JpdGUuY3N2KGRhdCwgZmlsZSA9IGhlcmUoIkRhdGEiLCAnRGF0YV9wcm9jZXNzZWQuY3N2JyksIHJvdy5uYW1lcyA9IFRSVUUpCmBgYAoKIyBEYXRhIGV4cGxvcmF0aW9uCgojIyBHZW5lcmFsICAKYGBgIHtyLCBtZXNzYWdlID0gRkFMU0UsIHdhcm5pbmcgPSBGQUxTRSwgZXZhbCA9IEZBTFNFfQojTnVtYmVyIG9mIGVmZmVjdCBzaXplcwpsZW5ndGgodW5pcXVlKGRhdCRFU19JRCkpICAKCiNOdW1iZXIgb2Ygc3R1ZGllcwpsZW5ndGgodW5pcXVlKGRhdCRTdHVkeV9JRCkpCgojUHVibGljYXRpb24geWVhcnMKbWluKGRhdCRZZWFyX3B1Ymxpc2hlZCkgCm1heChkYXQkWWVhcl9wdWJsaXNoZWQpCmBgYAoKIyMgRXhwbG9yZSBhc3NvY2lhdGlvbnMgYW1vbmcgcHJlZGljdG9yIHZhcmlhYmxlcyAgIAoKYGBge3IsIHJlc3VsdHMgPSAnaGlkZSd9CnBsb3RfbWlzc2luZyA8LSB2aXNfbWlzcyhkYXQpICsKICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41LCB2anVzdCA9IDMpLCAKICAgICAgICBwbG90Lm1hcmdpbiA9IG1hcmdpbih0ID0gMC41LCByID0gMywgYiA9IDEsIGwgPSAxLCB1bml0ID0gImNtIikpICsKICBnZ3RpdGxlKCJNaXNzaW5nIGRhdGEgaW4gdGhlIHNlbGVjdGVkIHByZWRpY3RvcnMiKSAjbm8gbWlzc2luZyB2YWx1ZXMKCnBsb3RfbWlzc2luZwojdXNlR29vZG1hbiBhbmQgS3J1c2thbOKAmXMgz4QgbWVhc3VyZSBvZiBhc3NvY2lhdGlvbiBiZXR3ZWVuIGNhdGVnb3JpY2FsIHByZWRpY3RvciB2YXJpYWJsZXMgKGZ1bmN0aW9uIGZyb20gcGFja2FnZSBHb29kbWFuS3J1c2thbDogaHR0cHM6Ly9jcmFuLnItcHJvamVjdC5vcmcvd2ViL3BhY2thZ2VzL0dvb2RtYW5LcnVza2FsL3ZpZ25ldHRlcy9Hb29kbWFuS3J1c2thbC5odG1sKQojR0ttYXRyaXggPC0gR0t0YXVEYXRhZnJhbWUoc3Vic2V0KGRhdCwgc2VsZWN0ID0gYygiU2V4IiwgIlR5cGVfYXNzYXkiLCAiTGVhcm5pbmdfdnNfbWVtb3J5IiwgIyJUeXBlX3JlaW5mb3JjZW1lbnQiLCAgIlR5cGVfc3RyZXNzX2V4cG9zdXJlIiwgIkFnZV9zdHJlc3NfZXhwb3N1cmUiLCAiU3RyZXNzX2R1cmF0aW9uIiwgIyJFRV9zb2NpYWxfSFIiLCAiRUVfZXhlcmNpc2UiLCAiQWdlX0VFX2V4cG9zdXJlIiwgIkV4cG9zdXJlX29yZGVyIiwgIkFnZV9hc3NheSIpKSkKI3Bsb3QoR0ttYXRyaXgpCgojc2ltcGxlIHBhaXJ3aXNlIGNvbnRpbmdlbmN5IHRhYmxlcwojIHRhYmxlKGRhdCRUeXBlX2Fzc2F5LCBkYXQkVHlwZV9yZWluZm9yY2VtZW50KSAKIyB0YWJsZShkYXQkQWdlX3N0cmVzc19leHBvc3VyZSwgZGF0JEFnZV9FRV9leHBvc3VyZSkgCiMgdGFibGUoZGF0JFR5cGVfc3RyZXNzX2V4cG9zdXJlLCBkYXQkQWdlX3N0cmVzc19leHBvc3VyZSkKIyB0YWJsZShkYXQkVHlwZV9zdHJlc3NfZXhwb3N1cmUsIGRhdCRBZ2VfYXNzYXkpCiMgdGFibGUoZGF0JFR5cGVfc3RyZXNzX2V4cG9zdXJlLCBkYXQkU3RyZXNzX2R1cmF0aW9uKQpgYGAKCiMjIEFsbHV2aWFsIGRpYWdyYW1zIHsudGFic2V0fQoKIyMjIFN1YmplY3RzIGluZm86IHNwZWNpZXMtc3RyYWluLXNleAoKYGBge3IsIHJlc3VsdHM9ICdoaWRlJywgZmlnLndpZHRoPTEwLCBmaWcuaGVpZ2h0PTd9CmZyZXFfQSA8LSBhcy5kYXRhLmZyYW1lKHRhYmxlKGRhdCRTZXgsIGRhdCRDb21tb25fc3BlY2llcywgZGF0JFN0cmFpbikpICU+JSByZW5hbWUoU2V4ID0gVmFyMSwgU3BlY2llcyA9IFZhcjIsIFN0cmFpbiA9IFZhcjMpICNtYWtlIGEgZGF0YSBmcmFtZSBvZiBmcmVxdWVuY2llcyBmb3IgdGhyZWUgc2VsZWN0ZWQgdmFyaWFibGVzCmlzX2FsbHV2aWFfZm9ybShhcy5kYXRhLmZyYW1lKGZyZXFfQSksIGF4ZXMgPSAxOjMsIHNpbGVudCA9IFRSVUUpCgpwMSA8LSBnZ3Bsb3QoZGF0YSA9IGZyZXFfQSwKICBhZXMoYXhpczEgPSBTZXgsIGF4aXMyID0gU3BlY2llcywgYXhpczMgPSBTdHJhaW4sIHkgPSBGcmVxKSkgKwogIGdlb21fYWxsdXZpdW0oYWVzKGZpbGwgPSBTZXgpKSArCiAgZ2VvbV9mbG93KCkgKwogIGdlb21fc3RyYXR1bShhZXMoZmlsbCA9IFNleCkpICsKICBnZW9tX3RleHQoc3RhdCA9ICJzdHJhdHVtIiwgYWVzKGxhYmVsID0gYWZ0ZXJfc3RhdChzdHJhdHVtKSkpICsKICAjdGhlbWVfbWluaW1hbCgpICsKICB0aGVtZV92b2lkKCkgKwogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiwKICAgICAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMCwgdmp1c3QgPSAzKSwKICAgICAgICBheGlzLnRpdGxlLnggPSBlbGVtZW50X3RleHQoKSwKICAgICAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChmYWNlPSJib2xkIiksCiAgICAgICAgcGxvdC5tYXJnaW4gPSB1bml0KGMoMSwgMSwgMCwgMSksICJjbSIpKSArCiAgc2NhbGVfeF9kaXNjcmV0ZShsaW1pdHMgPSBjKCJTZXgiLCAiU3BlY2llcyIsICJTdHJhaW4iKSwgZXhwYW5kID0gYygwLjE1LCAwLjA1KSwgcG9zaXRpb24gPSAidG9wIikgKwogIGdndGl0bGUoIkEgIHN0dWR5IHN1YmplY3RzIikKCnAxCmBgYAoKIyMjIEVFIGluZm86IHR5cGUtZXhlcmNpc2Utc29jaWFsIEVFCgpgYGB7ciwgcmVzdWx0cyA9ICdoaWRlJywgZmlnLndpZHRoPTEwLCBmaWcuaGVpZ2h0PTd9CiNUT0RPIGNoYW5nZSBlbnJpY2htZW50IHR5cGUgdG8gYWdlCgpmcmVxX0IgPC0gYXMuZGF0YS5mcmFtZSh0YWJsZShkYXQkQWdlX0VFX2V4cG9zdXJlLCBkYXQkRUVfZXhlcmNpc2UsIGRhdCRFRV9zb2NpYWwpKSAlPiUgcmVuYW1lKEFnZV9FRV9leHBvc3VyZSA9IFZhcjEsIEVFX2V4ZXJjaXNlID0gVmFyMiwgRUVfc29jaWFsID0gVmFyMykgI21ha2UgYSBkYXRhIGZyYW1lIG9mIGZyZXF1ZW5jaWVzIGZvciB0aHJlZSBzZWxlY3RlZCB2YXJpYWJsZXMKaXNfYWxsdXZpYV9mb3JtKGFzLmRhdGEuZnJhbWUoZnJlcV9CKSwgYXhlcyA9IDE6Mywgc2lsZW50ID0gVFJVRSkKCnAyIDwtIGdncGxvdChkYXRhID0gZnJlcV9CLAogIGFlcyhheGlzMSA9IEFnZV9FRV9leHBvc3VyZSwgYXhpczIgPSBFRV9leGVyY2lzZSwgYXhpczMgPSBFRV9zb2NpYWwsIHkgPSBGcmVxKSkgKwogIGdlb21fYWxsdXZpdW0oYWVzKGZpbGwgPSBBZ2VfRUVfZXhwb3N1cmUpKSArCiAgZ2VvbV9mbG93KCkgKwogIGdlb21fc3RyYXR1bShhZXMoZmlsbCA9IEFnZV9FRV9leHBvc3VyZSkpICsKICBnZW9tX3RleHQoc3RhdCA9ICJzdHJhdHVtIiwgYWVzKGxhYmVsID0gYWZ0ZXJfc3RhdChzdHJhdHVtKSkpICsKICAjdGhlbWVfbWluaW1hbCgpICsKICB0aGVtZV92b2lkKCkgKwogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiwKICAgICAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMCwgdmp1c3QgPSAzKSwKICAgICAgICBheGlzLnRpdGxlLnggPSBlbGVtZW50X3RleHQoKSwKICAgICAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChmYWNlPSJib2xkIiksCiAgICAgICAgcGxvdC5tYXJnaW4gPSB1bml0KGMoMSwgMSwgMCwgMSksICJjbSIpKSArCiAgc2NhbGVfeF9kaXNjcmV0ZShsaW1pdHMgPSBjKCJBZ2UiLCAiRXhlcmNpc2UiLCAiU29jaWFsIiksIGV4cGFuZCA9IGMoMC4xLCAwLjEpLCBwb3NpdGlvbiA9ICJ0b3AiKSArCiAgZ2d0aXRsZSgiQyAgZW52aXJvbm1lbnRhbCBlbnJpY2htZW50IikKCnAyCmBgYAoKIyMjIFN0cmVzcyBpbmZvOiBhZ2UtZHVyYXRpb24tdHlwZSBzdHJlc3MKCmBgYHtyLCByZXN1bHRzID0gJ2hpZGUnLCBmaWcud2lkdGg9MTAsIGZpZy5oZWlnaHQ9N30KZnJlcV9DIDwtIGFzLmRhdGEuZnJhbWUodGFibGUoZGF0JEFnZV9zdHJlc3NfZXhwb3N1cmUsIGRhdCRTdHJlc3NfZHVyYXRpb24sIGRhdCRUeXBlX3N0cmVzc19leHBvc3VyZSkpICU+JSByZW5hbWUoQWdlX3N0cmVzcyA9IFZhcjEsIER1cmF0aW9uX3N0cmVzcyA9IFZhcjIsIFR5cGVfc3RyZXNzID0gVmFyMykgI21ha2UgYSBkYXRhIGZyYW1lIG9mIGZyZXF1ZW5jaWVzIGZvciB0aHJlZSBzZWxlY3RlZCB2YXJpYWJsZXMKaXNfYWxsdXZpYV9mb3JtKGFzLmRhdGEuZnJhbWUoZnJlcV9DKSwgYXhlcyA9IDE6Mywgc2lsZW50ID0gVFJVRSkKCnAzIDwtIGdncGxvdChkYXRhID0gZnJlcV9DLAogIGFlcyhheGlzMSA9IEFnZV9zdHJlc3MsIGF4aXMyID0gRHVyYXRpb25fc3RyZXNzLCBheGlzMyA9IFR5cGVfc3RyZXNzLCB5ID0gRnJlcSkpICsKICBnZW9tX2FsbHV2aXVtKGFlcyhmaWxsID0gQWdlX3N0cmVzcykpICsKICBnZW9tX2Zsb3coKSArCiAgZ2VvbV9zdHJhdHVtKGFlcyhmaWxsID0gQWdlX3N0cmVzcykpICsKICBnZW9tX3RleHQoc3RhdCA9ICJzdHJhdHVtIiwgYWVzKGxhYmVsID0gYWZ0ZXJfc3RhdChzdHJhdHVtKSkpICsKICAjdGhlbWVfbWluaW1hbCgpICsKICB0aGVtZV92b2lkKCkgKwogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiwKICAgICAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMCwgdmp1c3QgPSAzKSwKICAgICAgICBheGlzLnRpdGxlLnggPSBlbGVtZW50X3RleHQoKSwKICAgICAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChmYWNlPSJib2xkIiksCiAgICAgICAgcGxvdC5tYXJnaW4gPSB1bml0KGMoMSwgMSwgMCwgMSksICJjbSIpKSArCiAgc2NhbGVfeF9kaXNjcmV0ZShsaW1pdHMgPSBjKCJBZ2UiLCAiRHVyYXRpb24iLCAiVHlwZSIpLCBleHBhbmQgPSBjKDAuMSwgMC4xKSwgcG9zaXRpb24gPSAidG9wIikgKwogIGdndGl0bGUoIkIgIHN0cmVzcyBleHBvc3VyZSIpCgpwMwpgYGAKCiMjIyBBc3NheSBpbmZvOiBML00tdHlwZS1yZWluZm9yY2VtZW50CgpgYGB7ciwgcmVzdWx0cyA9ICdoaWRlJywgZmlnLndpZHRoPTEwLCBmaWcuaGVpZ2h0PTd9CmZyZXFfRCA8LSBhcy5kYXRhLmZyYW1lKHRhYmxlKGRhdCRMZWFybmluZ192c19tZW1vcnksIGRhdCRUeXBlX2Fzc2F5LCBkYXQkVHlwZV9yZWluZm9yY2VtZW50KSkgJT4lIHJlbmFtZShMZWFybmluZ19NZW1vcnkgPSBWYXIxLCBUeXBlID0gVmFyMiwgUmVpbmZvcmNlbWVudCA9IFZhcjMpICNtYWtlIGEgZGF0YSBmcmFtZSBvZiBmcmVxdWVuY2llcyBmb3IgdGhyZWUgc2VsZWN0ZWQgdmFyaWFibGVzCmlzX2FsbHV2aWFfZm9ybShhcy5kYXRhLmZyYW1lKGZyZXFfRCksIGF4ZXMgPSAxOjMsIHNpbGVudCA9IFRSVUUpCgpwNCA8LSBnZ3Bsb3QoZGF0YSA9IGZyZXFfRCwKICBhZXMoYXhpczEgPSBMZWFybmluZ19NZW1vcnksIGF4aXMyID0gVHlwZSwgYXhpczMgPSBSZWluZm9yY2VtZW50LCB5ID0gRnJlcSkpICsKICBnZW9tX2FsbHV2aXVtKGFlcyhmaWxsID0gTGVhcm5pbmdfTWVtb3J5KSkgKwogIGdlb21fZmxvdygpICsKICBnZW9tX3N0cmF0dW0oYWVzKGZpbGwgPSBMZWFybmluZ19NZW1vcnkpKSArCiAgZ2VvbV90ZXh0KHN0YXQgPSAic3RyYXR1bSIsIGFlcyhsYWJlbCA9IGFmdGVyX3N0YXQoc3RyYXR1bSkpKSArCiAgI3RoZW1lX21pbmltYWwoKSArCiAgdGhlbWVfdm9pZCgpICsKICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIsCiAgICAgICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAsIHZqdXN0ID0gMyksCiAgICAgICAgYXhpcy50aXRsZS54ID0gZWxlbWVudF90ZXh0KCksCiAgICAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoZmFjZT0iYm9sZCIpLAogICAgICAgIHBsb3QubWFyZ2luID0gdW5pdChjKDEsIDEsIDAsIDEpLCAiY20iKSkgKwogIHNjYWxlX3hfZGlzY3JldGUobGltaXRzID0gYygiTGVhcm5pbmdfTWVtb3J5IiwgIlR5cGUiLCAiUmVpbmZvcmNlbWVudCIpLCBleHBhbmQgPSBjKDAuMSwgMC4xKSwgcG9zaXRpb24gPSAidG9wIikgKwogIGdndGl0bGUoIkQgIGNvZ25pdGl2ZSBhc3NheSIpCgpwNApgYGAKCiMjIyBDb21iaW5lZCBwbG90CgpgYGB7ciwgZmlnLndpZHRoPTEwLCBmaWcuaGVpZ2h0PTd9CiNwMSArIHNjYWxlX2ZpbGxfYnJld2VyKHBhbGV0dGUgPSAiU2V0MyIpICNQYXN0ZWwxCgoocDEgKyBzY2FsZV9maWxsX2JyZXdlcihwYWxldHRlID0gIlNldDMiKSkgLyAocDIgKyBzY2FsZV9maWxsX2JyZXdlcihwYWxldHRlID0gIlNldDMiKSkgLyAocDMgKyBzY2FsZV9maWxsX2JyZXdlcihwYWxldHRlID0gIlNldDMiKSkgLyAocDQgKyBzY2FsZV9maWxsX2JyZXdlcihwYWxldHRlID0gIlNldDMiKSkgKyBwbG90X2xheW91dChuY29sID0gMSwgaGVpZ2h0cyA9IGMoMSwxLDEsMSwxKSkKCiNnZ3NhdmUoZmlsZSA9ICIuL2ZpZ3MvQWxsdXZpYWxfZGlhZ3JhbXNfdjIucGRmIiwgd2lkdGggPSAxMCwgaGVpZ2h0ID0gMTIsIHVuaXRzID0gImNtIiwgZHBpID0gMzAwLCBzY2FsZSA9IDIpICMsIGRldmljZSA9IGNhaXJvX3BkZikKYGBgCgojIE1vZGVsbGluZyB3aXRoIGxuUlIKCiMjIEVudmlyb25tZW50YWwgZW5yaWNobWVudAoKIyMjIE1ldGEtYW5hbHlzaXMKCmBgYCB7cn0KI2RhdCA8LSByZWFkX2NzdihoZXJlKCJEYXRhIiwiRGF0YV9wcm9jZXNzZWQuY3N2IikpCgptb2RfRTAgPC0gcm1hLm12KHlpID0gbG5SUl9FYSwgViA9IFZDVl9FLCByYW5kb20gPSBsaXN0KH4xfFN0dWR5X0lELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfjF8RVNfSUQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB+MXxTdHJhaW4pLAogICAgICAgICAgICAgICAgIHRlc3QgPSAidCIsCiAgICAgICAgICAgICAgICAgZGF0YSA9IGRhdCkKc3VtbWFyeShtb2RfRTApIAppMl9tbChtb2RfRTApIAoKb3JjaGFyZF9wbG90KG1vZF9FMCwgbW9kID0gIkludCIsIHhsYWIgPSAibG5SUiIsIGFscGhhPTAuNCkgKyAgIyBPcmNoYXJkIHBsb3QgCiAgZ2VvbV9lcnJvcmJhcmgoYWVzKHhtaW4gPSBsb3dlclBSLCB4bWF4ID0gdXBwZXJQUiksIGhlaWdodCA9IDAsIHNob3cubGVnZW5kID0gRkFMU0UsIHNpemUgPSAxLjEsIGFscGhhID0gMC41KSsgIyBwcmVkaWN0aW9uIGludGVydmFscwogIGdlb21fZXJyb3JiYXJoKGFlcyh4bWluID0gbG93ZXJDTCwgeG1heCA9IHVwcGVyQ0wpLCBoZWlnaHQgPSAwLjA1LCBzaG93LmxlZ2VuZCA9IEZBTFNFLCBzaXplID0gMikrICMgY29uZmlkZW5jZSBpbnRlcnZhbHMKICBnZW9tX3BvaW50KGFlcyhmaWxsID0gbmFtZSksICBzaXplID0gNSwgc2hhcGUgPSAyMSkrICMgbWVhbiBlc3RpbWF0ZQogIHNjYWxlX2NvbG91cl9tYW51YWwodmFsdWVzID0gImRhcmtvcmFuZ2UiKSsgIyBjaGFuZ2UgY29sb3VycwogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcz0iZGFya29yYW5nZSIpKyAKICBzY2FsZV9zaXplX2NvbnRpbnVvdXMocmFuZ2UgPSBjKDEsIDcpKSsgIyBjaGFuZ2UgcG9pbnQgc2NhbGluZwogIHRoZW1lKHBhbmVsLmJvcmRlciA9IGVsZW1lbnRfcmVjdChjb2xvdXIgPSAiYmxhY2siLCBmaWxsPU5BLCBzaXplPTEuMyksICMgYm9yZGVyIGFyb3VuZCB0aGUgcGxvdAogICAgICAgIHRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDI0KSwgIyBjaGFuZ2UgZm9udCBzaXplcwogICAgICAgIGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTUpLAogICAgICAgIGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMykpIApgYGAKCiMjIyBNZXRhLXJlZ3Jlc3Npb246IHVuaS1tb2RlcmF0b3Igey50YWJzZXR9CgojIyMjIFR5cGUgb2YgYXNzYXkKCmBgYCB7ciwgZmlnLndpZHRoPTEwLCBmaWcuaGVpZ2h0PTd9CmRhdDEgPC0gZmlsdGVyKGRhdCwgVHlwZV9hc3NheSAlaW4lIGMoIlJlY29nbml0aW9uIiwgIkhhYml0dWF0aW9uIiwgIkNvbmRpdGlvbmluZyIpKQpWQ1ZfRTEgPC0gaW1wdXRlX2NvdmFyaWFuY2VfbWF0cml4KHZpID0gZGF0MSRsblJSVl9FLCBjbHVzdGVyID0gZGF0JFN0dWR5X0lELCByID0gMC41KQoKbW9kX0UxIDwtIHJtYS5tdih5aSA9IGxuUlJfRWEsIFYgPSBWQ1ZfRTEsIG1vZCA9IH5UeXBlX2Fzc2F5LTEsIHJhbmRvbSA9IGxpc3QofjF8U3R1ZHlfSUQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB+MXxFU19JRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH4xfFN0cmFpbiksCiAgICAgICAgICAgICAgICAgdGVzdCA9ICJ0IiwKICAgICAgICAgICAgICAgICBkYXRhID0gZGF0MSkKCnN1bW1hcnkobW9kX0UxKQpyMl9tbChtb2RfRTEpIAoKTGVhcm5pbmdfRSA8LSBvcmNoYXJkX3Bsb3QobW9kX0UxLCBtb2QgPSAiVHlwZV9hc3NheSIsIHhsYWIgPSAibG5SUiIsIGFscGhhPTAuNCkgKyAKICBnZW9tX2Vycm9yYmFyaChhZXMoeG1pbiA9IGxvd2VyUFIsIHhtYXggPSB1cHBlclBSKSwgaGVpZ2h0ID0gMCwgc2hvdy5sZWdlbmQgPSBGQUxTRSwgc2l6ZSA9IDEuMSwgYWxwaGEgPSAwLjUpICsgIyBwcmVkaWN0aW9uIGludGVydmFscwogIGdlb21fZXJyb3JiYXJoKGFlcyh4bWluID0gbG93ZXJDTCwgeG1heCA9IHVwcGVyQ0wpLCBoZWlnaHQgPSAwLjA1LCBzaG93LmxlZ2VuZCA9IEZBTFNFLCBzaXplID0gMikgKyAjIGNvbmZpZGVuY2UgaW50ZXJ2YWxzCiAgeGxpbSgtMC41LCAyKSArIAogIGdlb21fcG9pbnQoYWVzKGZpbGwgPSBuYW1lKSwgIHNpemUgPSA1LCBzaGFwZSA9IDIxKSsgIyBtZWFuIGVzdGltYXRlCiAgc2NhbGVfc2l6ZV9jb250aW51b3VzKHJhbmdlID0gYygxLCA3KSkrICMgY2hhbmdlIHBvaW50IHNjYWxpbmcKICB0aGVtZShwYW5lbC5ib3JkZXIgPSBlbGVtZW50X3JlY3QoY29sb3VyID0gImJsYWNrIiwgZmlsbD1OQSwgc2l6ZT0xLjMpLCAjIGJvcmRlciBhcm91bmQgdGhlIHBsb3QKICAgICAgICB0ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNSksICMgY2hhbmdlIGZvbnQgc2l6ZXMKICAgICAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEwKSwKICAgICAgICBsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTApKSAKCkxlYXJuaW5nX0UKYGBgCgojIyMjIExlYXJuaW5nIHZzIE1lbW9yeQoKYGBgIHtyLCBmaWcud2lkdGg9MTAsIGZpZy5oZWlnaHQ9N30KbW9kX0UyIDwtICBybWEubXYoeWkgPSBsblJSX0VhLCBWID0gVkNWX0UsIG1vZCA9IH5MZWFybmluZ192c19tZW1vcnktMSwgcmFuZG9tID0gbGlzdCh+MXxTdHVkeV9JRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH4xfEVTX0lELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfjF8U3RyYWluKSwKICAgICAgICAgICAgICAgICAgdGVzdCA9ICJ0IiwKICAgICAgICAgICAgICAgICAgZGF0YSA9IGRhdCkKCnN1bW1hcnkobW9kX0UyKSAKcjJfbWwobW9kX0UyKSAKCkx2c01fRTwtIG9yY2hhcmRfcGxvdChtb2RfRTIsIG1vZCA9ICJMZWFybmluZ192c19tZW1vcnkiLCB4bGFiID0gImxuUlIiLCBhbHBoYT0wLjQpICsgCiAgZ2VvbV9lcnJvcmJhcmgoYWVzKHhtaW4gPSBsb3dlclBSLCB4bWF4ID0gdXBwZXJQUiksIGhlaWdodCA9IDAsIHNob3cubGVnZW5kID0gRkFMU0UsIHNpemUgPSAxLjEsIGFscGhhID0gMC41KSArICMgcHJlZGljdGlvbiBpbnRlcnZhbHMKICBnZW9tX2Vycm9yYmFyaChhZXMoeG1pbiA9IGxvd2VyQ0wsIHhtYXggPSB1cHBlckNMKSwgaGVpZ2h0ID0gMC4wNSwgc2hvdy5sZWdlbmQgPSBGQUxTRSwgc2l6ZSA9IDIpICsgIyBjb25maWRlbmNlIGludGVydmFscwogIHhsaW0oLTAuNSwgMikgKyAKICBnZW9tX3BvaW50KGFlcyhmaWxsID0gbmFtZSksICBzaXplID0gNSwgc2hhcGUgPSAyMSkrICMgbWVhbiBlc3RpbWF0ZQogIHNjYWxlX3NpemVfY29udGludW91cyhyYW5nZSA9IGMoMSwgNykpKyAjIGNoYW5nZSBwb2ludCBzY2FsaW5nCiAgdGhlbWUocGFuZWwuYm9yZGVyID0gZWxlbWVudF9yZWN0KGNvbG91ciA9ICJibGFjayIsIGZpbGw9TkEsIHNpemU9MS4zKSwgIyBib3JkZXIgYXJvdW5kIHRoZSBwbG90CiAgICAgICAgdGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTUpLCAjIGNoYW5nZSBmb250IHNpemVzCiAgICAgICAgbGVnZW5kLnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMCksCiAgICAgICAgbGVnZW5kLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEwKSkgCgpMdnNNX0UKYGBgCgojIyMjIFR5cGUgb2YgcmVpbmZvcmNlbWVudCAKCmBgYCB7ciwgZmlnLndpZHRoPTEwLCBmaWcuaGVpZ2h0PTd9CgpkYXQyIDwtIGZpbHRlcihkYXQsIFR5cGVfcmVpbmZvcmNlbWVudCAlaW4lIGMoIkFwcGV0aXRpdmUiLCAiQXZlcnNpdmUiLCAiTm90IGFwcGxpY2FibGUiKSkKVkNWX0UyIDwtIGltcHV0ZV9jb3ZhcmlhbmNlX21hdHJpeCh2aSA9IGRhdDIkbG5SUlZfRSwgY2x1c3RlciA9IGRhdDIkU3R1ZHlfSUQsIHIgPSAwLjUpCm1vZF9FMyA8LSBybWEubXYoeWkgPSBsblJSX0VhLCBWID0gVkNWX0UyLCBtb2QgPSB+IFR5cGVfcmVpbmZvcmNlbWVudC0xLCByYW5kb20gPSBsaXN0KH4xfFN0dWR5X0lELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH4xfEVTX0lELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH4xfFN0cmFpbiksCiAgICAgICAgICAgICAgICAgdGVzdCA9ICJ0IiwKICAgICAgICAgICAgICAgICBkYXRhID0gZGF0MikKCnN1bW1hcnkobW9kX0UzKQpyMl9tbChtb2RfRTMpIAoKUmVpbmZvcmNlbWVudF9FIDwtb3JjaGFyZF9wbG90KG1vZF9FMywgbW9kID0gIlR5cGVfcmVpbmZvcmNlbWVudCIsIHhsYWIgPSAibG5SUiIsIGFscGhhPTAuNCkgKyAKICBnZW9tX2Vycm9yYmFyaChhZXMoeG1pbiA9IGxvd2VyUFIsIHhtYXggPSB1cHBlclBSKSwgaGVpZ2h0ID0gMCwgc2hvdy5sZWdlbmQgPSBGQUxTRSwgc2l6ZSA9IDEuMSwgYWxwaGEgPSAwLjUpICsgIyBwcmVkaWN0aW9uIGludGVydmFscwogIGdlb21fZXJyb3JiYXJoKGFlcyh4bWluID0gbG93ZXJDTCwgeG1heCA9IHVwcGVyQ0wpLCBoZWlnaHQgPSAwLjA1LCBzaG93LmxlZ2VuZCA9IEZBTFNFLCBzaXplID0gMikgKyAjIGNvbmZpZGVuY2UgaW50ZXJ2YWxzCiAgeGxpbSgtMC41LCAyKSArIAogIGdlb21fcG9pbnQoYWVzKGZpbGwgPSBuYW1lKSwgIHNpemUgPSA1LCBzaGFwZSA9IDIxKSsgIyBtZWFuIGVzdGltYXRlCiAgc2NhbGVfc2l6ZV9jb250aW51b3VzKHJhbmdlID0gYygxLCA3KSkrICMgY2hhbmdlIHBvaW50IHNjYWxpbmcKICB0aGVtZShwYW5lbC5ib3JkZXIgPSBlbGVtZW50X3JlY3QoY29sb3VyID0gImJsYWNrIiwgZmlsbD1OQSwgc2l6ZT0xLjMpLCAjIGJvcmRlciBhcm91bmQgdGhlIHBsb3QKICAgICAgICB0ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNSksICMgY2hhbmdlIGZvbnQgc2l6ZXMKICAgICAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEwKSwKICAgICAgICBsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTApKSAKClJlaW5mb3JjZW1lbnRfRQpgYGBgCgojIyMjIFNvY2lhbCBlbnJpY2htZW50CgpgYGAge3IsICBmaWcud2lkdGg9MTAsIGZpZy5oZWlnaHQ9N30KZGF0NSA8LSBmaWx0ZXIoZGF0LCBFRV9zb2NpYWwgJWluJSBjKCJTb2NpYWwiLCAiTm9uLXNvY2lhbCIpKQpWQ1ZfRTUgPC0gaW1wdXRlX2NvdmFyaWFuY2VfbWF0cml4KHZpID0gZGF0NSRsblJSVl9FLCBjbHVzdGVyID0gZGF0JFN0dWR5X0lELCByID0gMC41KQogIAptb2RfRTQ8LSBybWEubXYoeWkgPSBsblJSX0VhLCBWID0gVkNWX0U1LCBtb2QgPSB+RUVfc29jaWFsLTEsIHJhbmRvbSA9IGxpc3QofjF8U3R1ZHlfSUQsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH4xfEVTX0lELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH4xfFN0cmFpbiksCiAgICAgICAgICAgICAgICB0ZXN0ID0gInQiLGRhdGEgPSBkYXQ1KQoKc3VtbWFyeShtb2RfRTQpCnIyX21sKG1vZF9FNCkgCgpTb2NpYWxfRSA8LW9yY2hhcmRfcGxvdChtb2RfRTQsIG1vZCA9ICJFRV9zb2NpYWwiLCB4bGFiID0gImxuUlIiLCBhbHBoYT0wLjQpICsgCiAgZ2VvbV9lcnJvcmJhcmgoYWVzKHhtaW4gPSBsb3dlclBSLCB4bWF4ID0gdXBwZXJQUiksIGhlaWdodCA9IDAsIHNob3cubGVnZW5kID0gRkFMU0UsIHNpemUgPSAxLjEsIGFscGhhID0gMC41KSArICMgcHJlZGljdGlvbiBpbnRlcnZhbHMKICBnZW9tX2Vycm9yYmFyaChhZXMoeG1pbiA9IGxvd2VyQ0wsIHhtYXggPSB1cHBlckNMKSwgaGVpZ2h0ID0gMC4wNSwgc2hvdy5sZWdlbmQgPSBGQUxTRSwgc2l6ZSA9IDIpICsgIyBjb25maWRlbmNlIGludGVydmFscwogIHhsaW0oLTAuNSwgMikgKyAKICBnZW9tX3BvaW50KGFlcyhmaWxsID0gbmFtZSksICBzaXplID0gNSwgc2hhcGUgPSAyMSkrICMgbWVhbiBlc3RpbWF0ZQogIHNjYWxlX3NpemVfY29udGludW91cyhyYW5nZSA9IGMoMSwgNykpKyAjIGNoYW5nZSBwb2ludCBzY2FsaW5nCiAgdGhlbWUocGFuZWwuYm9yZGVyID0gZWxlbWVudF9yZWN0KGNvbG91ciA9ICJibGFjayIsIGZpbGw9TkEsIHNpemU9MS4zKSwgIyBib3JkZXIgYXJvdW5kIHRoZSBwbG90CiAgICAgICB0ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNSksICMgY2hhbmdlIGZvbnQgc2l6ZXMKICAgICAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEwKSwKICAgICAgICBsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTApKSAKClNvY2lhbF9FIApgYGAKCiMjIyMgRXhlcmNpc2UgZW5yaWNobWVudAoKYGBgIHtyLCBmaWcud2lkdGg9MTAsIGZpZy5oZWlnaHQ9N30KbW9kX0U1PC0gcm1hLm12KHlpID0gbG5SUl9FYSwgViA9IFZDVl9FLCBtb2QgPSB+RUVfZXhlcmNpc2UtMSwgcmFuZG9tID0gbGlzdCh+MXxTdHVkeV9JRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH4xfEVTX0lELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfjF8U3RyYWluKSwKICAgICAgICAgICAgICAgIHRlc3QgPSAidCIsCiAgICAgICAgICAgICAgICBkYXRhID0gZGF0KQoKc3VtbWFyeShtb2RfRTUpCnIyX21sKG1vZF9FNSkgCiAKRXhlcmNpc2VfRSA8LW9yY2hhcmRfcGxvdChtb2RfRTUsIG1vZCA9ICJFRV9leGVyY2lzZSIsIHhsYWIgPSAibG5SUiIsIGFscGhhPTAuNCkgKyAKICBnZW9tX2Vycm9yYmFyaChhZXMoeG1pbiA9IGxvd2VyUFIsIHhtYXggPSB1cHBlclBSKSwgaGVpZ2h0ID0gMCwgc2hvdy5sZWdlbmQgPSBGQUxTRSwgc2l6ZSA9IDEuMSwgYWxwaGEgPSAwLjUpICsgIyBwcmVkaWN0aW9uIGludGVydmFscwogIGdlb21fZXJyb3JiYXJoKGFlcyh4bWluID0gbG93ZXJDTCwgeG1heCA9IHVwcGVyQ0wpLCBoZWlnaHQgPSAwLjA1LCBzaG93LmxlZ2VuZCA9IEZBTFNFLCBzaXplID0gMikgKyAjIGNvbmZpZGVuY2UgaW50ZXJ2YWxzCiAgeGxpbSgtMC41LCAyKSArIAogIGdlb21fcG9pbnQoYWVzKGZpbGwgPSBuYW1lKSwgIHNpemUgPSA1LCBzaGFwZSA9IDIxKSsgIyBtZWFuIGVzdGltYXRlCiAgc2NhbGVfc2l6ZV9jb250aW51b3VzKHJhbmdlID0gYygxLCA3KSkrICMgY2hhbmdlIHBvaW50IHNjYWxpbmcKICB0aGVtZShwYW5lbC5ib3JkZXIgPSBlbGVtZW50X3JlY3QoY29sb3VyID0gImJsYWNrIiwgZmlsbD1OQSwgc2l6ZT0xLjMpLCAjIGJvcmRlciBhcm91bmQgdGhlIHBsb3QKICAgICAgICB0ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNSksICMgY2hhbmdlIGZvbnQgc2l6ZXMKICAgICAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEwKSwKICAgICAgICBsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTApKSAKCkV4ZXJjaXNlX0UKYGBgCgojIyMjIEFnZSBvZiBlbnJpY2htZW50CgpgYGAge3IsIGZpZy53aWR0aD0xMCwgZmlnLmhlaWdodD03fQpkYXQ2IDwtIGZpbHRlcihkYXQsIEFnZV9FRV9leHBvc3VyZSAlaW4lIGMoIkFkdWx0IiwgIkFkb2xlc2NlbnQiKSkKVkNWX0U2IDwtIGltcHV0ZV9jb3ZhcmlhbmNlX21hdHJpeCh2aSA9IGRhdDYkbG5SUlZfRSwgY2x1c3RlciA9IGRhdDYkU3R1ZHlfSUQsIHIgPSAwLjUpCgoKbW9kX0U2IDwtIHJtYS5tdih5aSA9IGxuUlJfRWEsIFYgPSBWQ1ZfRTYsIG1vZCA9IH5BZ2VfRUVfZXhwb3N1cmUtMSwgcmFuZG9tID0gbGlzdCh+MXxTdHVkeV9JRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfjF8RVNfSUQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH4xfFN0cmFpbiksCiAgICAgICAgICAgICAgICAgdGVzdCA9ICJ0IiwKICAgICAgICAgICAgICAgICBkYXRhID0gZGF0NikKCnN1bW1hcnkobW9kX0U2KSAKcjJfbWwobW9kX0U2KSAKCkFnZV9FPC0gb3JjaGFyZF9wbG90KG1vZF9FNiwgbW9kID0gIkFnZV9FRV9leHBvc3VyZSIsIHhsYWIgPSAibG5SUiIsIGFscGhhPTAuNCkgKyAKICBnZW9tX2Vycm9yYmFyaChhZXMoeG1pbiA9IGxvd2VyUFIsIHhtYXggPSB1cHBlclBSKSwgaGVpZ2h0ID0gMCwgc2hvdy5sZWdlbmQgPSBGQUxTRSwgc2l6ZSA9IDEuMSwgYWxwaGEgPSAwLjUpICsgIyBwcmVkaWN0aW9uIGludGVydmFscwogIGdlb21fZXJyb3JiYXJoKGFlcyh4bWluID0gbG93ZXJDTCwgeG1heCA9IHVwcGVyQ0wpLCBoZWlnaHQgPSAwLjA1LCBzaG93LmxlZ2VuZCA9IEZBTFNFLCBzaXplID0gMikgKyAjIGNvbmZpZGVuY2UgaW50ZXJ2YWxzCiAgeGxpbSgtMC41LCAyKSArIAogIGdlb21fcG9pbnQoYWVzKGZpbGwgPSBuYW1lKSwgIHNpemUgPSA1LCBzaGFwZSA9IDIxKSsgIyBtZWFuIGVzdGltYXRlCiAgc2NhbGVfc2l6ZV9jb250aW51b3VzKHJhbmdlID0gYygxLCA3KSkrICMgY2hhbmdlIHBvaW50IHNjYWxpbmcKICB0aGVtZShwYW5lbC5ib3JkZXIgPSBlbGVtZW50X3JlY3QoY29sb3VyID0gImJsYWNrIiwgZmlsbD1OQSwgc2l6ZT0xLjMpLCAjIGJvcmRlciBhcm91bmQgdGhlIHBsb3QKICAgICAgICB0ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNSksICMgY2hhbmdlIGZvbnQgc2l6ZXMKICAgICAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEwKSwKICAgICAgICBsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTApKSAgCgpBZ2VfRQpgYGAKCiMjIyAgTXVsdGktbW9kZXJhdG9yIG1vZGVsCgpgYGAge3IsIGV2YWwgPSBGQUxTRX0KCiMgZmlsdGVyIGRhdGEgc28gdGhhdCBhbGwgSyA8IDUgYXJlIHJlbW92ZWQKZGF0X0VmbSA8LSBkYXQgJT4lCiAgZmlsdGVyKFR5cGVfYXNzYXkgJWluJSBjKCJSZWNvZ25pdGlvbiIsICJIYWJpdHVhdGlvbiIsICJDb25kaXRpb25pbmciKSwKICAgICAgICAgVHlwZV9yZWluZm9yY2VtZW50ICVpbiUgYygiQXBwZXRpdGl2ZSIsICJBdmVyc2l2ZSIsICJOb3QgYXBwbGljYWJsZSIpLAogICAgICAgICBFRV9zb2NpYWwgJWluJSBjKCJTb2NpYWwiLCAiTm9uLXNvY2lhbCIpLCAKICAgICAgICAgQWdlX0VFX2V4cG9zdXJlICVpbiUgYygiQWR1bHQiLCAiQWRvbGVzY2VudCIpKQoKVkNWX0VmbSA8LSBpbXB1dGVfY292YXJpYW5jZV9tYXRyaXgodmkgPSBkYXRfRWZtJGxuUlJWX0UsIGNsdXN0ZXIgPSBkYXRfRWZtJFN0dWR5X0lELCByID0gMC41KQogICAgICAgICAgICAgICAgIAptb2RfRWZtIDwtIHJtYS5tdih5aSA9IGxuUlJfU2EsIFYgPSBWQ1ZfRWZtLCBtb2QgPSB+VHlwZV9hc3NheS0xICsgTGVhcm5pbmdfdnNfbWVtb3J5ICsgVHlwZV9yZWluZm9yY2VtZW50ICsgRUVfc29jaWFsICsgRUVfZXhlcmNpc2UgKyBBZ2VfRUVfZXhwb3N1cmUgLCByYW5kb20gPSAgIGxpc3QofjF8U3R1ZHlfSUQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH4xfEVTX0lELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB+MXxTdHJhaW4pLAogICAgICAgICAgICAgICAgICAgIHRlc3QgPSAidCIsCiAgICAgICAgICAgICAgICAgZGF0YSA9IGRhdF9FZm0pCiNzdW1tYXJ5KG1vZF9FZm0pCiNyMl9tbChtb2RfRWZtKSAKCnJlc19FZm0gPC0gZHJlZGdlKG1vZF9FZm0sIHRyYWNlPTIpCnNhdmVSRFMocmVzX0VmbSwgZmlsZSA9IGhlcmUoIlJkYXRhIiwgInJlc19FZm0ucmRzIikpCiMgYWxzbyBzYXZpbmcgdGhlIGZ1bGwgbW9kZWwgYW5kIGRhdGEKc2F2ZVJEUyhtb2RfRWZtLCBmaWxlID0gaGVyZSgiUmRhdGEiLCAibW9kX0VmbS5yZHMiKSkKc2F2ZVJEUyhkYXRfRWZtLCBmaWxlID0gaGVyZSgiUmRhdGEiLCAiZGF0X0VmbS5yZHMiKSkKYGBgCgpgYGB7cn0KZGF0X0VmbSA8LSByZWFkUkRTKGZpbGUgPSBoZXJlKCJSZGF0YSIsICJkYXRfRWZtLnJkcyIpKQptb2RfRWZtIDwtIHJlYWRSRFMoZmlsZSA9IGhlcmUoIlJkYXRhIiwgIm1vZF9FZm0ucmRzIikpCnJlc19FZm0gPC0gcmVhZFJEUyhmaWxlID0gaGVyZSgiUmRhdGEiLCAicmVzX0VmbS5yZHMiKSkKcmVzX0VmbTI8LSBzdWJzZXQocmVzX0VmbSwgZGVsdGEgPD0gNiwgcmVjYWxjLndlaWdodHM9RkFMU0UpCmltcG9ydGFuY2UocmVzX0VmbTIpCmBgYAoKIyMjIFB1YmxpY2F0aW9uIGJpYXMgJiBzZW5zaXRpdml0eSBhbmFseXNpcwoKIyMjIyBQdWJsaWNhdGlvbiBiaWFzIHRlc3RzCgpgYGAge3IsIHJlc3VsdHMgPSAnaGlkZSd9CgojIGZ1bm5lbCBwbG90CkZ1bm5lbF9FPC1mdW5uZWwobW9kX0VmbSwgeGxhYiA9ICJsblJSIiwgeWxhYiA9ICJTdGFuZGFyZCBFcnJvciIpCkZ1bm5lbF9FCiN5ZWFyIHB1Ymxpc2hlZCB3YXMgc2NhbGVkIHByZXZpb3VzbHkgIHVuZGVyIHN0cmVzcyBQQgoKZGF0X0VmbSRzcXJ0X2ludl9lX24gPC0gd2l0aChkYXRfRWZtLCBzcXJ0KDEvQ0NfbiArIDEvRUNfbiArIDEvRVNfbiArIDEvQ1NfbikpCgpQQl9NUl9FPC0gcm1hLm12KGxuUlJfU2EsIGxuUlJWX1MsIG1vZHMgPSB+MSArIHNxcnRfaW52X2VfbiArICBMZWFybmluZ192c19tZW1vcnkgKyBZZWFyX3B1Ymxpc2hlZCArIFR5cGVfYXNzYXkgKyBUeXBlX3JlaW5mb3JjZW1lbnQgKyBFRV9zb2NpYWwgKyBFRV9leGVyY2lzZSArIEFnZV9zdHJlc3NfZXhwb3N1cmUsIHJhbmRvbSA9IGxpc3QofjF8U3R1ZHlfSUQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB+MXxFU19JRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH4xfFN0cmFpbiksIG1ldGhvZCA9ICJSRU1MIiwgdGVzdCA9ICJ0IiwgCiAgICBkYXRhID0gZGF0X0VmbSkKCmVzdGltYXRlc19QQl9NUl9FPC0gZXN0aW1hdGVzLkNJKFBCX01SX0UpCiNlc3RpbWF0ZXNfUEJfTVJfRQoKYGBgCgojIyMjIExlYXZlLW9uZS1vdXQgYW5hbHlzaXMKCmBgYCB7ciwgZXZhbCA9IEZBTFNFfQpkYXQkU3R1ZHlfSUQgPC0gYXMuZmFjdG9yKGRhdCRTdHVkeV9JRCkKCkxlYXZlT25lT3V0X2VmZmVjdHNpemUgPC0gbGlzdCgpCmZvcihpIGluIDE6bGVuZ3RoKGxldmVscyhkYXQkU3R1ZHlfSUQpKSl7CiAgTGVhdmVPbmVPdXRfZWZmZWN0c2l6ZVtbaV1dIDwtIHJtYS5tdih5aSA9IGxuUlJfRWEsIFYgPSBsblJSVl9FLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhbmRvbSA9IGxpc3QofjEgfCBTdHVkeV9JRCx+MXwgRVNfSUQsIH4xIHwgU3RyYWluKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2QgPSAiUkVNTCIsIGRhdGEgPSBkYXRbZGF0JFN0dWR5X0lECiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIT0gbGV2ZWxzKGRhdCRTdHVkeV9JRClbaV0sIF0pfQoKCiMgd3JpdGluZyBmdW5jdGlvbiBmb3IgZXh0cmFjdGluZyBlc3QsIGNpLmxiLCBhbmQgY2kudWIgZnJvbSBhbGwgbW9kZWxzCmVzdC5mdW5jIDwtIGZ1bmN0aW9uKG1vZF9FMCl7CiAgZGYgPC0gZGF0YS5mcmFtZShlc3QgPSBtb2RfRTAkYiwgbG93ZXIgPSBtb2RfRTAkY2kubGIsIHVwcGVyID0gbW9kX0UwJGNpLnViKQogIHJldHVybihkZikKfQoKCiN1c2luZyBkcGx5ciB0byBmb3JtIGRhdGEgZnJhbWUKTUFfQ1ZSX0UgPC0gbGFwcGx5KExlYXZlT25lT3V0X2VmZmVjdHNpemUsIGZ1bmN0aW9uKHgpIGVzdC5mdW5jKHgpKSU+JSBiaW5kX3Jvd3MgJT4lIG11dGF0ZShsZWZ0X291dCA9IGxldmVscyhkYXQkU3R1ZHlfSUQpKQoKCnNhdmVSRFMoTUFfQ1ZSX0UsZmlsZSA9IGhlcmUoIlJkYXRhIiwgIk1BX0NWUl9FLnJkcyIpKQpgYGAKCmBgYCB7cn0KI3RlbGxpbmcgZ2dwbG90IHRvIHN0b3AgcmVvcmRlcmluZyBmYWN0b3JzCk1BX0NWUl9FIDwtIHJlYWRSRFMoZmlsZSA9IGhlcmUoIlJkYXRhIiwgIk1BX0NWUl9FLnJkcyIpKQoKTUFfQ1ZSX0UkbGVmdF9vdXQ8LSBhcy5mYWN0b3IoTUFfQ1ZSX0UkbGVmdF9vdXQpCk1BX0NWUl9FJGxlZnRfb3V0PC1mYWN0b3IoTUFfQ1ZSX0UkbGVmdF9vdXQsIGxldmVscyA9IE1BX0NWUl9FJGxlZnRfb3V0KQoKCiNwbG90dGluZwpsZWF2ZW9uZW91dF9FIDwtIGdncGxvdChNQV9DVlJfRSkgKwogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDAsIGx0eSA9IDIsIGx3ZCA9IDEpICsKICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSBtb2RfRTAkY2kubGIsIGx0eSA9IDMsIGx3ZCA9IDAuNzUsIGNvbG91ciA9ICJibGFjayIpICsKICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSBtb2RfRTAkYiwgbHR5ID0gMSwgbHdkID0gMC43NSwgY29sb3VyID0gImJsYWNrIikgKwogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IG1vZF9FMCRjaS51YiwgbHR5ID0gMywgbHdkID0gMC43NSwgY29sb3VyID0gImJsYWNrIikgKwogIGdlb21fcG9pbnRyYW5nZShhZXMoeCA9IGxlZnRfb3V0LCB5ID0gZXN0LCB5bWluID0gbG93ZXIsIHltYXggPSB1cHBlcikpICsKICB4bGFiKCJTdHVkeSBsZWZ0IG91dCIpICsgCiAgeWxhYigibG5SUiwgOTUlIENJIikgKyAKICBjb29yZF9mbGlwKCkgKwogIHRoZW1lKHBhbmVsLmdyaWQubWlub3IgPSBlbGVtZW50X2JsYW5rKCkpKwogIHRoZW1lX2J3KCkgKyB0aGVtZShwYW5lbC5ncmlkLm1ham9yID0gZWxlbWVudF9ibGFuaygpKSArCiAgdGhlbWUocGFuZWwuZ3JpZC5taW5vci54ID0gZWxlbWVudF9ibGFuaygpICkgKwogIHRoZW1lKGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KHNpemUgPSA2KSkKCmxlYXZlb25lb3V0X0UKCmRhdCRTdHVkeV9JRCA8LSBhcy5pbnRlZ2VyKGRhdCRTdHVkeV9JRCkKYGBgCgojIyBTdHJlc3MKCiMjIyBNZXRhLWFuYWx5c2lzCgpgYGAge3J9Cm1vZF9TMCA8LSBybWEubXYoeWkgPSBsblJSX1NhLCBWID0gVkNWX1MsIHJhbmRvbSA9IGxpc3QofjF8U3R1ZHlfSUQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB+MXxFU19JRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH4xfFN0cmFpbiksCiAgICAgICAgICAgICAgICAgdGVzdCA9ICJ0IiwgCiAgICAgICAgICAgICAgICAgZGF0YSA9IGRhdCkKCnN1bW1hcnkobW9kX1MwKSAKaTJfbWwobW9kX1MwKSAKCm9yY2hhcmRfcGxvdChtb2RfUzAsIG1vZCA9ICJJbnQiLCB4bGFiID0gImxuUlIiLCBhbHBoYT0wLjQpICsgCiAgZ2VvbV9lcnJvcmJhcmgoYWVzKHhtaW4gPSBsb3dlclBSLCB4bWF4ID0gdXBwZXJQUiksIGhlaWdodCA9IDAsIHNob3cubGVnZW5kID0gRkFMU0UsIHNpemUgPSAxLjEsIGFscGhhID0gMC41KSArICMgcHJlZGljdGlvbiBpbnRlcnZhbHMKICBnZW9tX2Vycm9yYmFyaChhZXMoeG1pbiA9IGxvd2VyQ0wsIHhtYXggPSB1cHBlckNMKSwgaGVpZ2h0ID0gMC4wNSwgc2hvdy5sZWdlbmQgPSBGQUxTRSwgc2l6ZSA9IDIpICsgIyBjb25maWRlbmNlIGludGVydmFscwogIGdlb21fcG9pbnQoYWVzKGZpbGwgPSBuYW1lKSwgIHNpemUgPSA1LCBzaGFwZSA9IDIxKSsgIyBtZWFuIGVzdGltYXRlCiAgc2NhbGVfc2l6ZV9jb250aW51b3VzKHJhbmdlID0gYygxLCA3KSkrICMgY2hhbmdlIHBvaW50IHNjYWxpbmcKICB0aGVtZShwYW5lbC5ib3JkZXIgPSBlbGVtZW50X3JlY3QoY29sb3VyID0gImJsYWNrIiwgZmlsbD1OQSwgc2l6ZT0xLjMpLCAjIGJvcmRlciBhcm91bmQgdGhlIHBsb3QKICAgICAgICB0ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAyNCksICMgY2hhbmdlIGZvbnQgc2l6ZXMKICAgICAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE1KSwKICAgICAgICBsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTMpKSAKYGBgCgojIyMgTWV0YS1yZWdyZXNzaW9uOiB1bmktbW9kZXJhdG9yIHsudGFic2V0fQoKIyMjIyBUeXBlIG9mIGFzc2F5CgpgYGAge3IsIGZpZy53aWR0aD0xMCwgZmlnLmhlaWdodD03fQpkYXQkVHlwZV9hc3NheTwtYXMuZmFjdG9yKGRhdCRUeXBlX2Fzc2F5KQoKVkNWX1MxIDwtIGltcHV0ZV9jb3ZhcmlhbmNlX21hdHJpeCh2aSA9IGRhdDEkbG5SUlZfUywgY2x1c3RlciA9IGRhdCRTdHVkeV9JRCwgciA9IDAuNSkKCgptb2RfUzEgPC0gcm1hLm12KHlpID0gbG5SUl9TYSwgViA9IFZDVl9TMSwgbW9kID0gflR5cGVfYXNzYXktMSwgcmFuZG9tID0gICBsaXN0KH4xfFN0dWR5X0lELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB+MXxFU19JRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfjF8U3RyYWluKSwKICAgICAgICAgICAgICAgICB0ZXN0ID0gInQiLAogICAgICAgICAgICAgICAgIGRhdGEgPSBkYXQxKQoKc3VtbWFyeShtb2RfUzEpCnIyX21sKG1vZF9TMSkgCgpMZWFybmluZ19TIDwtb3JjaGFyZF9wbG90KG1vZF9TMSwgbW9kID0gIlR5cGVfYXNzYXkiLCB4bGFiID0gImxuUlIiLCBhbHBoYT0wLjQpICsgCiAgZ2VvbV9lcnJvcmJhcmgoYWVzKHhtaW4gPSBsb3dlclBSLCB4bWF4ID0gdXBwZXJQUiksIGhlaWdodCA9IDAsIHNob3cubGVnZW5kID0gRkFMU0UsIHNpemUgPSAxLjEsIGFscGhhID0gMC41KSArICMgcHJlZGljdGlvbiBpbnRlcnZhbHMKICBnZW9tX2Vycm9yYmFyaChhZXMoeG1pbiA9IGxvd2VyQ0wsIHhtYXggPSB1cHBlckNMKSwgaGVpZ2h0ID0gMC4wNSwgc2hvdy5sZWdlbmQgPSBGQUxTRSwgc2l6ZSA9IDIpICsgIyBjb25maWRlbmNlIGludGVydmFscwogIGdlb21fcG9pbnQoYWVzKGZpbGwgPSBuYW1lKSwgIHNpemUgPSA1LCBzaGFwZSA9IDIxKSsgIyBtZWFuIGVzdGltYXRlCiAgc2NhbGVfc2l6ZV9jb250aW51b3VzKHJhbmdlID0gYygxLCA3KSkrICMgY2hhbmdlIHBvaW50IHNjYWxpbmcKICB0aGVtZShwYW5lbC5ib3JkZXIgPSBlbGVtZW50X3JlY3QoY29sb3VyID0gImJsYWNrIiwgZmlsbD1OQSwgc2l6ZT0xLjMpLCAjIGJvcmRlciBhcm91bmQgdGhlIHBsb3QKICAgICAgICB0ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNSksICMgY2hhbmdlIGZvbnQgc2l6ZXMKICAgICAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEwKSwKICAgICAgICBsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTApKSAKCkxlYXJuaW5nX1MKYGBgCgojIyMjIExlYXJuaW5nIHZzIE1lbW9yeQoKYGBgIHtyLCBmaWcud2lkdGg9MTAsIGZpZy5oZWlnaHQ9N30KCm1vZF9TMiA8LSAgcm1hLm12KHlpID0gbG5SUl9TYSwgViA9IFZDVl9TLCBtb2QgPSB+TGVhcm5pbmdfdnNfbWVtb3J5LTEsIHJhbmRvbSA9IGxpc3QofjF8U3R1ZHlfSUQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB+MXxFU19JRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH4xfFN0cmFpbiksCiAgICAgICAgICAgICAgICAgIHRlc3QgPSAidCIsCiAgICAgICAgICAgICAgICAgIGRhdGEgPSBkYXQpCgpzdW1tYXJ5KG1vZF9TMikgCnIyX21sKG1vZF9TMikgCgpMdnNNX1MgPC0gb3JjaGFyZF9wbG90KG1vZF9TMiwgbW9kID0gIkxlYXJuaW5nX3ZzX21lbW9yeSIsIHhsYWIgPSAibG5SUiIsIGFscGhhPTAuNCkgKyAKICBnZW9tX2Vycm9yYmFyaChhZXMoeG1pbiA9IGxvd2VyUFIsIHhtYXggPSB1cHBlclBSKSwgaGVpZ2h0ID0gMCwgc2hvdy5sZWdlbmQgPSBGQUxTRSwgc2l6ZSA9IDEuMSwgYWxwaGEgPSAwLjUpICsgIyBwcmVkaWN0aW9uIGludGVydmFscwogIGdlb21fZXJyb3JiYXJoKGFlcyh4bWluID0gbG93ZXJDTCwgeG1heCA9IHVwcGVyQ0wpLCBoZWlnaHQgPSAwLjA1LCBzaG93LmxlZ2VuZCA9IEZBTFNFLCBzaXplID0gMikgKyAjIGNvbmZpZGVuY2UgaW50ZXJ2YWxzCiAgZ2VvbV9wb2ludChhZXMoZmlsbCA9IG5hbWUpLCAgc2l6ZSA9IDUsIHNoYXBlID0gMjEpKyAjIG1lYW4gZXN0aW1hdGUKICBzY2FsZV9zaXplX2NvbnRpbnVvdXMocmFuZ2UgPSBjKDEsIDcpKSsgIyBjaGFuZ2UgcG9pbnQgc2NhbGluZwogIHRoZW1lKHBhbmVsLmJvcmRlciA9IGVsZW1lbnRfcmVjdChjb2xvdXIgPSAiYmxhY2siLCBmaWxsPU5BLCBzaXplPTEuMyksICMgYm9yZGVyIGFyb3VuZCB0aGUgcGxvdAogICAgICAgdGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTUpLCAjIGNoYW5nZSBmb250IHNpemVzCiAgICAgICAgbGVnZW5kLnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMCksCiAgICAgICAgbGVnZW5kLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEwKSkgCgpMdnNNX1MgCmBgYAoKIyMjIyBUeXBlIG9mIHJlaW5mb3JjZW1lbnQKCmBgYCB7ciwgZmlnLndpZHRoPTEwLCBmaWcuaGVpZ2h0PTd9CgpWQ1ZfUzIgPC0gaW1wdXRlX2NvdmFyaWFuY2VfbWF0cml4KHZpID0gZGF0MiRsblJSVl9TLCBjbHVzdGVyID0gZGF0JFN0dWR5X0lELCByID0gMC41KQoKbW9kX1MzIDwtIHJtYS5tdih5aSA9IGxuUlJfU2EsIFYgPSBWQ1ZfUzIsIG1vZCA9IH4gVHlwZV9yZWluZm9yY2VtZW50LTEsIHJhbmRvbSA9IGxpc3QofjF8U3R1ZHlfSUQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfjF8RVNfSUQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfjF8U3RyYWluKSwKICAgICAgICAgICAgICAgICB0ZXN0ID0gInQiLAogICAgICAgICAgICAgICAgIGRhdGEgPSBkYXQyKQoKc3VtbWFyeShtb2RfUzMpCnIyX21sKG1vZF9TMykgCgpSZWluZm9yY2VtZW50X1MgPC1vcmNoYXJkX3Bsb3QobW9kX1MzLCBtb2QgPSAiVHlwZV9yZWluZm9yY2VtZW50IiwgeGxhYiA9ICJsblJSIiwgYWxwaGE9MC40KSArIAogIGdlb21fZXJyb3JiYXJoKGFlcyh4bWluID0gbG93ZXJQUiwgeG1heCA9IHVwcGVyUFIpLCBoZWlnaHQgPSAwLCBzaG93LmxlZ2VuZCA9IEZBTFNFLCBzaXplID0gMS4xLCBhbHBoYSA9IDAuNSkgKyAjIHByZWRpY3Rpb24gaW50ZXJ2YWxzCiAgZ2VvbV9lcnJvcmJhcmgoYWVzKHhtaW4gPSBsb3dlckNMLCB4bWF4ID0gdXBwZXJDTCksIGhlaWdodCA9IDAuMDUsIHNob3cubGVnZW5kID0gRkFMU0UsIHNpemUgPSAyKSArICMgY29uZmlkZW5jZSBpbnRlcnZhbHMKICBnZW9tX3BvaW50KGFlcyhmaWxsID0gbmFtZSksICBzaXplID0gNSwgc2hhcGUgPSAyMSkrICMgbWVhbiBlc3RpbWF0ZQogIHNjYWxlX3NpemVfY29udGludW91cyhyYW5nZSA9IGMoMSwgNykpKyAjIGNoYW5nZSBwb2ludCBzY2FsaW5nCiAgdGhlbWUocGFuZWwuYm9yZGVyID0gZWxlbWVudF9yZWN0KGNvbG91ciA9ICJibGFjayIsIGZpbGw9TkEsIHNpemU9MS4zKSwgIyBib3JkZXIgYXJvdW5kIHRoZSBwbG90CiAgICAgICB0ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNSksICMgY2hhbmdlIGZvbnQgc2l6ZXMKICAgICAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEwKSwKICAgICAgICBsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTApKSAKClJlaW5mb3JjZW1lbnRfUwpgYGBgCgojIyMjIFR5cGUgb2Ygc3RyZXNzCgpgYGAge3IsIGZpZy53aWR0aD0xMCwgZmlnLmhlaWdodD03fQpkYXQzIDwtIGZpbHRlcihkYXQsIFR5cGVfc3RyZXNzX2V4cG9zdXJlICVpbiUgYygiUmVzdHJhaW50IiwgIk5vaXNlIiwgIk1TIiwgIkNvbWJpbmF0aW9uIikpClZDVl9TMyA8LSBpbXB1dGVfY292YXJpYW5jZV9tYXRyaXgodmkgPSBkYXQzJGxuUlJWX1MsIGNsdXN0ZXIgPSBkYXQzJFN0dWR5X0lELCByID0gMC41KQoKbW9kX1M0IDwtIHJtYS5tdih5aSA9IGxuUlJfU2EsIFYgPSBWQ1ZfUzMsIG1vZCA9IH5UeXBlX3N0cmVzc19leHBvc3VyZS0xLCByYW5kb20gPSBsaXN0KH4xfFN0dWR5X0lELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH4xfEVTX0lELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH4xfFN0cmFpbiksCiAgICAgICAgICAgICAgICAgdGVzdCA9ICJ0IiwKICAgICAgICAgICAgICAgICBkYXRhID0gZGF0MykKc3VtbWFyeShtb2RfUzQpIApyMl9tbChtb2RfUzQpCgpTdHJlc3NvcjwtIG9yY2hhcmRfcGxvdChtb2RfUzQsIG1vZCA9ICJUeXBlX3N0cmVzc19leHBvc3VyZSIsIHhsYWIgPSAibG5SUiIsIGFscGhhPTAuNCkgKyAKICBnZW9tX2Vycm9yYmFyaChhZXMoeG1pbiA9IGxvd2VyUFIsIHhtYXggPSB1cHBlclBSKSwgaGVpZ2h0ID0gMCwgc2hvdy5sZWdlbmQgPSBGQUxTRSwgc2l6ZSA9IDEuMSwgYWxwaGEgPSAwLjUpICsgIyBwcmVkaWN0aW9uIGludGVydmFscwogIGdlb21fZXJyb3JiYXJoKGFlcyh4bWluID0gbG93ZXJDTCwgeG1heCA9IHVwcGVyQ0wpLCBoZWlnaHQgPSAwLjA1LCBzaG93LmxlZ2VuZCA9IEZBTFNFLCBzaXplID0gMikgKyAjIGNvbmZpZGVuY2UgaW50ZXJ2YWxzCiAgZ2VvbV9wb2ludChhZXMoZmlsbCA9IG5hbWUpLCAgc2l6ZSA9IDUsIHNoYXBlID0gMjEpKyAjIG1lYW4gZXN0aW1hdGUKICBzY2FsZV9zaXplX2NvbnRpbnVvdXMocmFuZ2UgPSBjKDEsIDcpKSsgIyBjaGFuZ2UgcG9pbnQgc2NhbGluZwogIHRoZW1lKHBhbmVsLmJvcmRlciA9IGVsZW1lbnRfcmVjdChjb2xvdXIgPSAiYmxhY2siLCBmaWxsPU5BLCBzaXplPTEuMyksICMgYm9yZGVyIGFyb3VuZCB0aGUgcGxvdAogICAgICAgIHRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE1KSwgIyBjaGFuZ2UgZm9udCBzaXplcwogICAgICAgIGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTApLAogICAgICAgIGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMCkpIAoKU3RyZXNzb3IKYGBgYAoKIyMjIyBBZ2Ugb2Ygc3RyZXNzCgpgYGAge3IsIGZpZy53aWR0aD0xMCwgZmlnLmhlaWdodD03fQpWQ1ZfUzNhIDwtIGltcHV0ZV9jb3ZhcmlhbmNlX21hdHJpeCh2aSA9IGRhdCRsblJSVl9TLCBjbHVzdGVyID0gZGF0JFN0dWR5X0lELCByID0gMC41KQoKbW9kX1M1IDwtcm1hLm12KHlpID0gbG5SUl9TYSwgViA9IFZDVl9TM2EsIG1vZCA9IH5BZ2Vfc3RyZXNzX2V4cG9zdXJlLTEsIHJhbmRvbSA9IGxpc3QofjF8U3R1ZHlfSUQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH4xfEVTX0lELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB+MXxTdHJhaW4pLAogICAgICAgICAgICAgICAgdGVzdCA9ICJ0IiwKICAgICAgICAgICAgICAgIGRhdGEgPSBkYXQpCnN1bW1hcnkobW9kX1M1KSAKcjJfbWwobW9kX1M1KSAKCkFnZV9TIDwtIG9yY2hhcmRfcGxvdChtb2RfUzUsIG1vZCA9ICJBZ2Vfc3RyZXNzX2V4cG9zdXJlIiwgeGxhYiA9ICJsblJSIiwgYWxwaGE9MC40KSArIAogIGdlb21fZXJyb3JiYXJoKGFlcyh4bWluID0gbG93ZXJQUiwgeG1heCA9IHVwcGVyUFIpLCBoZWlnaHQgPSAwLCBzaG93LmxlZ2VuZCA9IEZBTFNFLCBzaXplID0gMS4xLCBhbHBoYSA9IDAuNSkgKyAjIHByZWRpY3Rpb24gaW50ZXJ2YWxzCiAgZ2VvbV9lcnJvcmJhcmgoYWVzKHhtaW4gPSBsb3dlckNMLCB4bWF4ID0gdXBwZXJDTCksIGhlaWdodCA9IDAuMDUsIHNob3cubGVnZW5kID0gRkFMU0UsIHNpemUgPSAyKSArICMgY29uZmlkZW5jZSBpbnRlcnZhbHMKICBnZW9tX3BvaW50KGFlcyhmaWxsID0gbmFtZSksICBzaXplID0gNSwgc2hhcGUgPSAyMSkrICMgbWVhbiBlc3RpbWF0ZQogIHNjYWxlX3NpemVfY29udGludW91cyhyYW5nZSA9IGMoMSwgNykpKyAjIGNoYW5nZSBwb2ludCBzY2FsaW5nCiAgdGhlbWUocGFuZWwuYm9yZGVyID0gZWxlbWVudF9yZWN0KGNvbG91ciA9ICJibGFjayIsIGZpbGw9TkEsIHNpemU9MS4zKSwgIyBib3JkZXIgYXJvdW5kIHRoZSBwbG90CiAgICAgICAgdGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTUpLCAjIGNoYW5nZSBmb250IHNpemVzCiAgICAgICAgbGVnZW5kLnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMCksCiAgICAgICAgbGVnZW5kLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEwKSkgCgpBZ2VfUyAKYGBgCgojIyMjIFN0ZXNzIGR1cmF0aW9uCgpgYGAge3IsICBmaWcud2lkdGg9MTAsIGZpZy5oZWlnaHQ9N30KZGF0NCA8LSBmaWx0ZXIoZGF0LCBTdHJlc3NfZHVyYXRpb24gJWluJSBjKCJDaHJvbmljIiwgIkFjdXRlIikpClZDVl9TNCA8LSBpbXB1dGVfY292YXJpYW5jZV9tYXRyaXgodmkgPSBkYXQ0JGxuUlJWX1MsIGNsdXN0ZXIgPSBkYXQ0JFN0dWR5X0lELCByID0gMC41KQoKbW9kX1M2IDwtcm1hLm12KHlpID0gbG5SUl9TYSwgViA9IFZDVl9TNCwgbW9kID0gflN0cmVzc19kdXJhdGlvbi0xLCByYW5kb20gPSBsaXN0KH4xfFN0dWR5X0lELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH4xfEVTX0lELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH4xfFN0cmFpbiksCiAgICAgICAgICAgICAgICB0ZXN0ID0gInQiLAogICAgICAgICAgICAgICAgZGF0YSA9IGRhdDQpCnN1bW1hcnkobW9kX1M2KSAKcjJfbWwobW9kX1M2KSAKCkR1cmF0aW9uX1MgPC0gb3JjaGFyZF9wbG90KG1vZF9TNiwgbW9kID0gIlN0cmVzc19kdXJhdGlvbiIsIHhsYWIgPSAibG5SUiIsIGFscGhhPTAuNCkgKyAKICBnZW9tX2Vycm9yYmFyaChhZXMoeG1pbiA9IGxvd2VyUFIsIHhtYXggPSB1cHBlclBSKSwgaGVpZ2h0ID0gMCwgc2hvdy5sZWdlbmQgPSBGQUxTRSwgc2l6ZSA9IDEuMSwgYWxwaGEgPSAwLjUpICsgIyBwcmVkaWN0aW9uIGludGVydmFscwogIGdlb21fZXJyb3JiYXJoKGFlcyh4bWluID0gbG93ZXJDTCwgeG1heCA9IHVwcGVyQ0wpLCBoZWlnaHQgPSAwLjA1LCBzaG93LmxlZ2VuZCA9IEZBTFNFLCBzaXplID0gMikgKyAjIGNvbmZpZGVuY2UgaW50ZXJ2YWxzCiAgZ2VvbV9wb2ludChhZXMoZmlsbCA9IG5hbWUpLCAgc2l6ZSA9IDUsIHNoYXBlID0gMjEpKyAjIG1lYW4gZXN0aW1hdGUKICBzY2FsZV9zaXplX2NvbnRpbnVvdXMocmFuZ2UgPSBjKDEsIDcpKSsgIyBjaGFuZ2UgcG9pbnQgc2NhbGluZwogIHRoZW1lKHBhbmVsLmJvcmRlciA9IGVsZW1lbnRfcmVjdChjb2xvdXIgPSAiYmxhY2siLCBmaWxsPU5BLCBzaXplPTEuMyksICMgYm9yZGVyIGFyb3VuZCB0aGUgcGxvdAogICAgICAgIHRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE1KSwgIyBjaGFuZ2UgZm9udCBzaXplcwogICAgICAgIGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTApLAogICAgICAgIGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMCkpIAoKRHVyYXRpb25fUyAKYGBgCgojIyMgIE11bHRpLW1vZGVyYXRvciBtb2RlbAoKYGBgIHtyLCBldmFsID0gRkFMU0V9Cgojc2VsZWN0aW5nIG1vZGVyYXRvciBsZXZlbHMgd2l0aCBrID49NQpkYXRfU2ZtIDwtIGRhdCAlPiUKICBmaWx0ZXIoVHlwZV9hc3NheSAlaW4lIGMoIlJlY29nbml0aW9uIiwgIkhhYml0dWF0aW9uIiwgIkNvbmRpdGlvbmluZyIpLAogICAgICAgICBUeXBlX3JlaW5mb3JjZW1lbnQgJWluJSBjKCJBcHBldGl0aXZlIiwgIkF2ZXJzaXZlIiwgIk5vdCBhcHBsaWNhYmxlIiksCiAgICAgICAgIFR5cGVfc3RyZXNzX2V4cG9zdXJlICVpbiUgYygiUmVzdHJhaW50IiwgIk5vaXNlIiwgIk1TIiwgIkNvbWJpbmF0aW9uIiksCiAgICAgICAgIFN0cmVzc19kdXJhdGlvbiAlaW4lIGMoIkNocm9uaWMiLCAiQWN1dGUiKSkKClZDVl9TZm0gPC0gaW1wdXRlX2NvdmFyaWFuY2VfbWF0cml4KHZpID0gZGF0X1NmbSRsblJSVl9FLCBjbHVzdGVyID0gZGF0X1NmbSRTdHVkeV9JRCwgciA9IDAuNSkKICAgICAgICAgICAgICAgICAKbW9kX1NmbSA8LSBybWEubXYoeWkgPSBsblJSX1NhLCBWID0gVkNWX1NmbSwgbW9kID0gfiBUeXBlX2Fzc2F5IC0xICsgTGVhcm5pbmdfdnNfbWVtb3J5ICsgVHlwZV9yZWluZm9yY2VtZW50ICsgVHlwZV9zdHJlc3NfZXhwb3N1cmUgKyBBZ2Vfc3RyZXNzX2V4cG9zdXJlICsgU3RyZXNzX2R1cmF0aW9uLCByYW5kb20gPSAgIGxpc3QofjF8U3R1ZHlfSUQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH4xfEVTX0lELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB+MXxTdHJhaW4pLAogICAgICAgICAgICAgICAgICAgIHRlc3QgPSAidCIsCiAgICAgICAgICAgICAgICAgZGF0YSA9IGRhdF9TZm0pCiNzdW1tYXJ5KG1vZF9TZm0pCiNyMl9tbChtb2RfU2ZtKSAKCnJlc19TZm0gPC0gZHJlZGdlKG1vZF9TZm0sIHRyYWNlPTIpCnNhdmVSRFMocmVzX1NmbSwgZmlsZSA9IGhlcmUoIlJkYXRhIiwgInJlc19TZm0ucmRzIikpCiMgYWxzbyBzYXZpbmcgdGhlIGZ1bGwgbW9kZWwgYW5kIGRhdGEKc2F2ZVJEUyhtb2RfU2ZtLCBmaWxlID0gaGVyZSgiUmRhdGEiLCAibW9kX1NmbS5yZHMiKSkKc2F2ZVJEUyhkYXRfU2ZtLCBmaWxlID0gaGVyZSgiUmRhdGEiLCAiZGF0X1NmbS5yZHMiKSkKYGBgCgpgYGB7cn0KZGF0X1NmbSA8LSByZWFkUkRTKGZpbGUgPSBoZXJlKCJSZGF0YSIsICJkYXRfU2ZtLnJkcyIpKQptb2RfU2ZtIDwtIHJlYWRSRFMoZmlsZSA9IGhlcmUoIlJkYXRhIiwgIm1vZF9TZm0ucmRzIikpCnJlc19TZm0gPC0gcmVhZFJEUyhmaWxlID0gaGVyZSgiUmRhdGEiLCAicmVzX1NmbS5yZHMiKSkKcmVzX1NmbTI8LSBzdWJzZXQocmVzX1NmbSwgZGVsdGEgPD0gNiwgcmVjYWxjLndlaWdodHM9RkFMU0UpCmltcG9ydGFuY2UocmVzX1NmbTIpIApgYGAKCiMjIyBQdWJsaWNhdGlvbiBiaWFzICYgc2Vuc2l0aXZpdHkgYW5hbHlzaXMKCiMjIyMgUHVibGljYXRpb24gYmlhcwoKYGBgIHtyLCByZXN1bHRzID0gJ2hpZGUnfQojIGZ1bm5lbCBwbG90CkZ1bm5lbF9TIDwtIGZ1bm5lbChtb2RfU2ZtLCB4bGFiID0gImxuUlIiLCB5bGFiID0gIlN0YW5kYXJkIEVycm9yIikKRnVubmVsX1MKCiNjYWxjdWxhdGluZyBpbnYgZWZmZWN0aXZlIHNhbXBsZSBzaXplIGZvciB1c2UgaW4gZnVsbCBtZXRhLXJlZ3Jlc3Npb24KZGF0X1NmbSRzcXJ0X2ludl9lX24gPC0gd2l0aChkYXRfU2ZtLCBzcXJ0KDEvQ0NfbiArIDEvRUNfbiArIDEvRVNfbiArIDEvQ1NfbikpCgojdGltZSBsYWcgYmlhcyBhbmQgZWdnZXJzIHJlZ3Jlc3Npb24KZGF0X1NmbSRjX1llYXJfcHVibGlzaGVkIDwtIGFzLnZlY3RvcihzY2FsZShkYXRfU2ZtJFllYXJfcHVibGlzaGVkLCBzY2FsZSA9IEYpKQoKUEJfTVJfUzwtIHJtYS5tdihsblJSX1NhLCBsblJSVl9TLCBtb2RzID0gfjEgKyBzcXJ0X2ludl9lX24gKyAgY19ZZWFyX3B1Ymxpc2hlZCArIFR5cGVfYXNzYXkgK0xlYXJuaW5nX3ZzX21lbW9yeSArIFR5cGVfcmVpbmZvcmNlbWVudCArIFR5cGVfc3RyZXNzX2V4cG9zdXJlICsgQWdlX3N0cmVzc19leHBvc3VyZSwgcmFuZG9tID0gbGlzdCh+MXxTdHVkeV9JRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH4xfEVTX0lELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfjF8U3RyYWluKSwgCiAgICAgICAgICAgICAgICAgbWV0aG9kID0gIlJFTUwiLCAKICAgICAgICAgICAgICAgICB0ZXN0ID0gInQiLCAKICAgICAgICAgICAgICAgICBkYXRhID0gZGF0X1NmbSwKICAgICAgICAgICAgICAgICAgY29udHJvbD1saXN0KG9wdGltaXplcj0ib3B0aW0iLCBvcHRtZXRob2Q9Ik5lbGRlci1NZWFkIikpCgplc3RpbWF0ZXNfUEJfTVJfUzwtIGVzdGltYXRlcy5DSShQQl9NUl9TKQojZXN0aW1hdGVzX1BCX01SX1MKCmBgYAoKIyMjIyBMZWF2ZS1vbmUtb3V0IHNlbnNpdGl2aXR5IGFuYWx5c2lzCgpgYGAge3IsIGV2YWwgPSBGQUxTRX0KZGF0JFN0dWR5X0lEIDwtIGFzLmZhY3RvcihkYXQkU3R1ZHlfSUQpCgpMZWF2ZU9uZU91dF9lZmZlY3RzaXplIDwtIGxpc3QoKQpmb3IoaSBpbiAxOmxlbmd0aChsZXZlbHMoZGF0JFN0dWR5X0lEKSkpewogIExlYXZlT25lT3V0X2VmZmVjdHNpemVbW2ldXSA8LSBybWEubXYoeWkgPSBsblJSX1NhLCBWID0gbG5SUlZfUywgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYW5kb20gPSBsaXN0KH4xIHwgU3R1ZHlfSUQsfjF8IEVTX0lELCB+MSB8IFN0cmFpbiksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kID0gIlJFTUwiLCBkYXRhID0gZGF0W2RhdCRTdHVkeV9JRAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICE9IGxldmVscyhkYXQkU3R1ZHlfSUQpW2ldLCBdKX0KCgojIHdyaXRpbmcgZnVuY3Rpb24gZm9yIGV4dHJhY3RpbmcgZXN0LCBjaS5sYiwgYW5kIGNpLnViIGZyb20gYWxsIG1vZGVscwplc3QuZnVuYyA8LSBmdW5jdGlvbihtb2RfRTApewogIGRmIDwtIGRhdGEuZnJhbWUoZXN0ID0gbW9kX0UwJGIsIGxvd2VyID0gbW9kX0UwJGNpLmxiLCB1cHBlciA9IG1vZF9FMCRjaS51YikKICByZXR1cm4oZGYpCn0KCgojdXNpbmcgZHBseXIgdG8gZm9ybSBkYXRhIGZyYW1lCk1BX0NWUl9TIDwtIGxhcHBseShMZWF2ZU9uZU91dF9lZmZlY3RzaXplLCBmdW5jdGlvbih4KSBlc3QuZnVuYyh4KSklPiUgYmluZF9yb3dzICU+JSBtdXRhdGUobGVmdF9vdXQgPSBsZXZlbHMoZGF0JFN0dWR5X0lEKSkKCnNhdmVSRFMoTUFfQ1ZSX1MsZmlsZSA9IGhlcmUoIlJkYXRhIiwgIk1BX0NWUl9TLnJkcyIpKQoKYGBgCgpgYGAge3J9Ck1BX0NWUl9TIDwtIHJlYWRSRFMoZmlsZSA9IGhlcmUoIlJkYXRhIiwgIk1BX0NWUl9TLnJkcyIpKQoKI3RlbGxpbmcgZ2dwbG90IHRvIHN0b3AgcmVvcmRlcmluZyBmYWN0b3JzCk1BX0NWUl9TJGxlZnRfb3V0PC0gYXMuZmFjdG9yKE1BX0NWUl9TJGxlZnRfb3V0KQpNQV9DVlJfUyRsZWZ0X291dDwtZmFjdG9yKE1BX0NWUl9TJGxlZnRfb3V0LCBsZXZlbHMgPSBNQV9DVlJfUyRsZWZ0X291dCkKCiNwbG90dGluZwpsZWF2ZW9uZW91dF9TIDwtIGdncGxvdChNQV9DVlJfUykgKwogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDAsIGx0eSA9IDIsIGx3ZCA9IDEpICsKICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSBtb2RfUzAkY2kubGIsIGx0eSA9IDMsIGx3ZCA9IDAuNzUsIGNvbG91ciA9ICJibGFjayIpICsKICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSBtb2RfUzAkYiwgbHR5ID0gMSwgbHdkID0gMC43NSwgY29sb3VyID0gImJsYWNrIikgKwogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IG1vZF9TMCRjaS51YiwgbHR5ID0gMywgbHdkID0gMC43NSwgY29sb3VyID0gImJsYWNrIikgKwogIGdlb21fcG9pbnRyYW5nZShhZXMoeCA9IGxlZnRfb3V0LCB5ID0gZXN0LCB5bWluID0gbG93ZXIsIHltYXggPSB1cHBlcikpICsKICB4bGFiKCJTdHVkeSBsZWZ0IG91dCIpICsgCiAgeWxhYigibG5SUiwgOTUlIENJIikgKyAKICBjb29yZF9mbGlwKCkgKwogIHRoZW1lKHBhbmVsLmdyaWQubWlub3IgPSBlbGVtZW50X2JsYW5rKCkpKwogIHRoZW1lX2J3KCkgKyB0aGVtZShwYW5lbC5ncmlkLm1ham9yID0gZWxlbWVudF9ibGFuaygpKSArCiAgdGhlbWUocGFuZWwuZ3JpZC5taW5vci54ID0gZWxlbWVudF9ibGFuaygpICkgKwogIHRoZW1lKGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KHNpemUgPSA2KSkKCmxlYXZlb25lb3V0X1MKCmRhdCRTdHVkeV9JRCA8LSBhcy5pbnRlZ2VyKGRhdCRTdHVkeV9JRCkKYGBgCgoKIyMgSW50ZXJhY3Rpb24gb2Ygc3RyZXNzIGFuZCBFRQoKIyMjIE1ldGEtYW5hbHlzaXMKCmBgYCB7cn0KbW9kX0VTMCA8LSBybWEubXYoeWkgPSBsblJSX0VTYSwgViA9IFZDVl9FUywgcmFuZG9tID0gbGlzdCh+MXxTdHVkeV9JRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH4xfEVTX0lELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfjF8U3RyYWluKSwKICAgICAgICAgICAgICAgICAgdGVzdCA9ICJ0IiwgCiAgICAgICAgICAgICAgICAgIGRhdGEgPSBkYXQpCgpzdW1tYXJ5KG1vZF9FUzApIAppMl9tbChtb2RfRVMwKSAKCm9yY2hhcmRfcGxvdChtb2RfRVMwLCBtb2QgPSAiSW50IiwgeGxhYiA9ICJsblJSIiwgYWxwaGE9MC40KSArIAogIGdlb21fZXJyb3JiYXJoKGFlcyh4bWluID0gbG93ZXJQUiwgeG1heCA9IHVwcGVyUFIpLCBoZWlnaHQgPSAwLCBzaG93LmxlZ2VuZCA9IEZBTFNFLCBzaXplID0gMS4xLCBhbHBoYSA9IDAuNSkgKyAjIHByZWRpY3Rpb24gaW50ZXJ2YWxzCiAgZ2VvbV9lcnJvcmJhcmgoYWVzKHhtaW4gPSBsb3dlckNMLCB4bWF4ID0gdXBwZXJDTCksIGhlaWdodCA9IDAuMDUsIHNob3cubGVnZW5kID0gRkFMU0UsIHNpemUgPSAyKSArICMgY29uZmlkZW5jZSBpbnRlcnZhbHMKICBnZW9tX3BvaW50KGFlcyhmaWxsID0gbmFtZSksICBzaXplID0gNSwgc2hhcGUgPSAyMSkrICMgbWVhbiBlc3RpbWF0ZQogIHNjYWxlX3NpemVfY29udGludW91cyhyYW5nZSA9IGMoMSwgNykpKyAjIGNoYW5nZSBwb2ludCBzY2FsaW5nCiAgdGhlbWUocGFuZWwuYm9yZGVyID0gZWxlbWVudF9yZWN0KGNvbG91ciA9ICJibGFjayIsIGZpbGw9TkEsIHNpemU9MS4zKSwgIyBib3JkZXIgYXJvdW5kIHRoZSBwbG90CiAgICAgICAgdGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMjQpLCAjIGNoYW5nZSBmb250IHNpemVzCiAgICAgICAgbGVnZW5kLnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNSksCiAgICAgICAgbGVnZW5kLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEzKSkgCmBgYGAKCiMjIyAgTWV0YS1yZWdyZXNzaW9uOiB1bmktbW9kZXJhdG9yIHsudGFic2V0fQoKIyMjIyBUeXBlIG9mIGFzc2F5CgpgYGAge3IsIGZpZy53aWR0aD0xMCwgZmlnLmhlaWdodD03fQpWQ1ZfRVMxIDwtIGltcHV0ZV9jb3ZhcmlhbmNlX21hdHJpeCh2aSA9IGRhdDEkbG5SUlZfRVMsIGNsdXN0ZXIgPSBkYXQkU3R1ZHlfSUQsIHIgPSAwLjUpCgptb2RfRVMxIDwtIHJtYS5tdih5aSA9IGxuUlJfRVNhLCBWID0gVkNWX0VTMSwgbW9kID0gflR5cGVfYXNzYXktMSwgcmFuZG9tID0gbGlzdCh+MXxTdHVkeV9JRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfjF8RVNfSUQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH4xfFN0cmFpbiksCiAgICAgICAgICAgICAgICAgIHRlc3QgPSAidCIsCiAgICAgICAgICAgICAgICAgIGRhdGEgPSBkYXQxKQoKc3VtbWFyeShtb2RfRVMxKQpyMl9tbChtb2RfRVMxKSAKCkxlYXJuaW5nX0VTIDwtIG9yY2hhcmRfcGxvdChtb2RfRVMxLCBtb2QgPSAiVHlwZV9hc3NheSIsIHhsYWIgPSAibG5SUiIsIGFscGhhPTAuNCkgKyAKICBnZW9tX2Vycm9yYmFyaChhZXMoeG1pbiA9IGxvd2VyUFIsIHhtYXggPSB1cHBlclBSKSwgaGVpZ2h0ID0gMCwgc2hvdy5sZWdlbmQgPSBGQUxTRSwgc2l6ZSA9IDEuMSwgYWxwaGEgPSAwLjUpICsgIyBwcmVkaWN0aW9uIGludGVydmFscwogIGdlb21fZXJyb3JiYXJoKGFlcyh4bWluID0gbG93ZXJDTCwgeG1heCA9IHVwcGVyQ0wpLCBoZWlnaHQgPSAwLjA1LCBzaG93LmxlZ2VuZCA9IEZBTFNFLCBzaXplID0gMikgKyAjIGNvbmZpZGVuY2UgaW50ZXJ2YWxzCiAgZ2VvbV9wb2ludChhZXMoZmlsbCA9IG5hbWUpLCAgc2l6ZSA9IDMsIHNoYXBlID0gMjEpKyAjIG1lYW4gZXN0aW1hdGUKICBzY2FsZV9zaXplX2NvbnRpbnVvdXMocmFuZ2UgPSBjKDEsIDcpKSsgIyBjaGFuZ2UgcG9pbnQgc2NhbGluZwogIHRoZW1lKHBhbmVsLmJvcmRlciA9IGVsZW1lbnRfcmVjdChjb2xvdXIgPSAiYmxhY2siLCBmaWxsPU5BLCBzaXplPTEuMyksICMgYm9yZGVyIGFyb3VuZCB0aGUgcGxvdAogICAgICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMCksICMgY2hhbmdlIGZvbnQgc2l6ZXMKICAgICAgICBheGlzLnRleHQueSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTApLAogICAgICAgIGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gNyksCiAgICAgICAgbGVnZW5kLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDcpKSAKCkxlYXJuaW5nX0VTCmBgYAoKIyMjIyBMZWFybmluZyB2cyBNZW1vcnkKCmBgYCB7ciwgZmlnLndpZHRoPTEwLCBmaWcuaGVpZ2h0PTd9Cm1vZF9FUzIgPC0gIHJtYS5tdih5aSA9IGxuUlJfRVNhLCBWID0gVkNWX0VTLCBtb2QgPSB+TGVhcm5pbmdfdnNfbWVtb3J5LTEsIHJhbmRvbSA9IGxpc3QofjF8U3R1ZHlfSUQsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfjF8RVNfSUQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB+MXxTdHJhaW4pLAogICAgICAgICAgICAgICAgICAgdGVzdCA9ICJ0IiwKICAgICAgICAgICAgICAgICAgIGRhdGEgPSBkYXQpCgpzdW1tYXJ5KG1vZF9FUzIpIApyMl9tbChtb2RfRVMyKSAKCkx2c01fRVMgPC0gb3JjaGFyZF9wbG90KG1vZF9FUzIsIG1vZCA9ICJMZWFybmluZ192c19tZW1vcnkiLCB4bGFiID0gImxuUlIiLCBhbHBoYT0wLjQpICsgCiAgZ2VvbV9lcnJvcmJhcmgoYWVzKHhtaW4gPSBsb3dlclBSLCB4bWF4ID0gdXBwZXJQUiksIGhlaWdodCA9IDAsIHNob3cubGVnZW5kID0gRkFMU0UsIHNpemUgPSAxLjEsIGFscGhhID0gMC41KSArICMgcHJlZGljdGlvbiBpbnRlcnZhbHMKICBnZW9tX2Vycm9yYmFyaChhZXMoeG1pbiA9IGxvd2VyQ0wsIHhtYXggPSB1cHBlckNMKSwgaGVpZ2h0ID0gMC4wNSwgc2hvdy5sZWdlbmQgPSBGQUxTRSwgc2l6ZSA9IDIpICsgIyBjb25maWRlbmNlIGludGVydmFscwogIGdlb21fcG9pbnQoYWVzKGZpbGwgPSBuYW1lKSwgIHNpemUgPSAzLCBzaGFwZSA9IDIxKSsgIyBtZWFuIGVzdGltYXRlCiAgc2NhbGVfc2l6ZV9jb250aW51b3VzKHJhbmdlID0gYygxLCA3KSkrICMgY2hhbmdlIHBvaW50IHNjYWxpbmcKICB0aGVtZShwYW5lbC5ib3JkZXIgPSBlbGVtZW50X3JlY3QoY29sb3VyID0gImJsYWNrIiwgZmlsbD1OQSwgc2l6ZT0xLjMpLCAjIGJvcmRlciBhcm91bmQgdGhlIHBsb3QKICAgICAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTApLCAjIGNoYW5nZSBmb250IHNpemVzCiAgICAgICAgYXhpcy50ZXh0LnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEwKSwKICAgICAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDcpLAogICAgICAgIGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSA3KSkgCgpMdnNNX0VTIApgYGAKCiMjIyMgVHlwZSBvZiByZWluZm9yY2VtZW50CgpgYGAge3IsIGZpZy53aWR0aD0xMCwgZmlnLmhlaWdodD03fQpWQ1ZfRVMyIDwtIGltcHV0ZV9jb3ZhcmlhbmNlX21hdHJpeCh2aSA9IGRhdDIkbG5SUlZfRVMsIGNsdXN0ZXIgPSBkYXQyJFN0dWR5X0lELCByID0gMC41KQoKbW9kX0VTMyA8LSBybWEubXYoeWkgPSBsblJSX0VTYSwgViA9IFZDVl9FUzIsIG1vZCA9IH4gVHlwZV9yZWluZm9yY2VtZW50LTEsIHJhbmRvbSA9IGxpc3QofjF8U3R1ZHlfSUQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfjF8RVNfSUQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfjF8U3RyYWluKSwKICAgICAgICAgICAgICAgICAgdGVzdCA9ICJ0IiwKICAgICAgICAgICAgICAgICAgZGF0YSA9IGRhdDIpCgpzdW1tYXJ5KG1vZF9FUzMpCnIyX21sKG1vZF9FUzMpIAoKUmVpbmZvcmNlbWVudF9FUyA8LSBvcmNoYXJkX3Bsb3QobW9kX0VTMywgbW9kID0gIlR5cGVfcmVpbmZvcmNlbWVudCIsIHhsYWIgPSAibG5SUiIsIGFscGhhPTAuNCkgKyAKICBnZW9tX2Vycm9yYmFyaChhZXMoeG1pbiA9IGxvd2VyUFIsIHhtYXggPSB1cHBlclBSKSwgaGVpZ2h0ID0gMCwgc2hvdy5sZWdlbmQgPSBGQUxTRSwgc2l6ZSA9IDEuMSwgYWxwaGEgPSAwLjUpICsgIyBwcmVkaWN0aW9uIGludGVydmFscwogIGdlb21fZXJyb3JiYXJoKGFlcyh4bWluID0gbG93ZXJDTCwgeG1heCA9IHVwcGVyQ0wpLCBoZWlnaHQgPSAwLjA1LCBzaG93LmxlZ2VuZCA9IEZBTFNFLCBzaXplID0gMikgKyAjIGNvbmZpZGVuY2UgaW50ZXJ2YWxzCiAgZ2VvbV9wb2ludChhZXMoZmlsbCA9IG5hbWUpLCAgc2l6ZSA9IDMsIHNoYXBlID0gMjEpKyAjIG1lYW4gZXN0aW1hdGUKICBzY2FsZV9zaXplX2NvbnRpbnVvdXMocmFuZ2UgPSBjKDEsIDcpKSsgIyBjaGFuZ2UgcG9pbnQgc2NhbGluZwogIHRoZW1lKHBhbmVsLmJvcmRlciA9IGVsZW1lbnRfcmVjdChjb2xvdXIgPSAiYmxhY2siLCBmaWxsPU5BLCBzaXplPTEuMyksICMgYm9yZGVyIGFyb3VuZCB0aGUgcGxvdAogICAgICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMCksICMgY2hhbmdlIGZvbnQgc2l6ZXMKICAgICAgICBheGlzLnRleHQueSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTApLAogICAgICAgIGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gNyksCiAgICAgICAgbGVnZW5kLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDcpKSAKClJlaW5mb3JjZW1lbnRfRVMgCmBgYGAKCiMjIyMgVHlwZSBvZiBzdHJlc3MKCmBgYCB7cn0KVkNWX0VTMyA8LSBpbXB1dGVfY292YXJpYW5jZV9tYXRyaXgodmkgPSBkYXQzJGxuUlJWX0VTLCBjbHVzdGVyID0gZGF0MyRTdHVkeV9JRCwgciA9IDAuNSkKbW9kX0VTNCA8LSBybWEubXYoeWkgPSBsblJSX0VTYSwgViA9IFZDVl9FUzMsIG1vZCA9IH5UeXBlX3N0cmVzc19leHBvc3VyZS0xLCByYW5kb20gPSBsaXN0KH4xfFN0dWR5X0lELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH4xfEVTX0lELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH4xfFN0cmFpbiksCiAgICAgICAgICAgICAgICAgIHRlc3QgPSAidCIsCiAgICAgICAgICAgICAgICAgIGRhdGEgPSBkYXQzKQpzdW1tYXJ5KG1vZF9FUzQpCnIyX21sKG1vZF9FUzQpCgpTdHJlc3Nvcl9FUyA8LSBvcmNoYXJkX3Bsb3QobW9kX0VTNCwgbW9kID0gIlR5cGVfc3RyZXNzX2V4cG9zdXJlIiwgeGxhYiA9ICJsblJSIiwgYWxwaGE9MC40KSArIAogIGdlb21fZXJyb3JiYXJoKGFlcyh4bWluID0gbG93ZXJQUiwgeG1heCA9IHVwcGVyUFIpLCBoZWlnaHQgPSAwLCBzaG93LmxlZ2VuZCA9IEZBTFNFLCBzaXplID0gMS4xLCBhbHBoYSA9IDAuNSkgKyAjIHByZWRpY3Rpb24gaW50ZXJ2YWxzCiAgZ2VvbV9lcnJvcmJhcmgoYWVzKHhtaW4gPSBsb3dlckNMLCB4bWF4ID0gdXBwZXJDTCksIGhlaWdodCA9IDAuMDUsIHNob3cubGVnZW5kID0gRkFMU0UsIHNpemUgPSAyKSArICMgY29uZmlkZW5jZSBpbnRlcnZhbHMKICBnZW9tX3BvaW50KGFlcyhmaWxsID0gbmFtZSksICBzaXplID0gMywgc2hhcGUgPSAyMSkrICMgbWVhbiBlc3RpbWF0ZQogIHNjYWxlX3NpemVfY29udGludW91cyhyYW5nZSA9IGMoMSwgNykpKyAjIGNoYW5nZSBwb2ludCBzY2FsaW5nCiAgdGhlbWUocGFuZWwuYm9yZGVyID0gZWxlbWVudF9yZWN0KGNvbG91ciA9ICJibGFjayIsIGZpbGw9TkEsIHNpemU9MS4zKSwgIyBib3JkZXIgYXJvdW5kIHRoZSBwbG90CiAgICAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEwKSwgIyBjaGFuZ2UgZm9udCBzaXplcwogICAgICAgIGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMCksCiAgICAgICAgbGVnZW5kLnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSA3KSwKICAgICAgICBsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gNykpICAKClN0cmVzc29yX0VTIApgYGBgCgojIyMjIEFnZSBvZiBzdHJlc3MKCmBgYCB7ciwgZmlnLndpZHRoPTEwLCBmaWcuaGVpZ2h0PTd9Cm1vZF9FUzUgPC1ybWEubXYoeWkgPSBsblJSX0VTYSwgViA9IFZDVl9FUywgbW9kID0gfkFnZV9zdHJlc3NfZXhwb3N1cmUtMSwgcmFuZG9tID0gbGlzdCh+MXxTdHVkeV9JRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfjF8RVNfSUQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH4xfFN0cmFpbiksCiAgICAgICAgICAgICAgICAgdGVzdCA9ICJ0IiwKICAgICAgICAgICAgICAgICBkYXRhID0gZGF0KQpzdW1tYXJ5KG1vZF9FUzUpIApyMl9tbChtb2RfRVM1KSAKCkFnZV9zdHJlc3NfRVM8LW9yY2hhcmRfcGxvdChtb2RfRVM1LCBtb2QgPSAiQWdlX3N0cmVzc19leHBvc3VyZSIsIHhsYWIgPSAibG5SUiIsIGFscGhhPTAuNCkgKyAKICBnZW9tX2Vycm9yYmFyaChhZXMoeG1pbiA9IGxvd2VyUFIsIHhtYXggPSB1cHBlclBSKSwgaGVpZ2h0ID0gMCwgc2hvdy5sZWdlbmQgPSBGQUxTRSwgc2l6ZSA9IDEuMSwgYWxwaGEgPSAwLjUpICsgIyBwcmVkaWN0aW9uIGludGVydmFscwogIGdlb21fZXJyb3JiYXJoKGFlcyh4bWluID0gbG93ZXJDTCwgeG1heCA9IHVwcGVyQ0wpLCBoZWlnaHQgPSAwLjA1LCBzaG93LmxlZ2VuZCA9IEZBTFNFLCBzaXplID0gMikgKyAjIGNvbmZpZGVuY2UgaW50ZXJ2YWxzCiAgZ2VvbV9wb2ludChhZXMoZmlsbCA9IG5hbWUpLCAgc2l6ZSA9IDMsIHNoYXBlID0gMjEpKyAjIG1lYW4gZXN0aW1hdGUKICBzY2FsZV9zaXplX2NvbnRpbnVvdXMocmFuZ2UgPSBjKDEsIDcpKSsgIyBjaGFuZ2UgcG9pbnQgc2NhbGluZwogIHRoZW1lKHBhbmVsLmJvcmRlciA9IGVsZW1lbnRfcmVjdChjb2xvdXIgPSAiYmxhY2siLCBmaWxsPU5BLCBzaXplPTEuMyksICMgYm9yZGVyIGFyb3VuZCB0aGUgcGxvdAogICAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEwKSwgIyBjaGFuZ2UgZm9udCBzaXplcwogICAgICAgIGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMCksCiAgICAgICAgbGVnZW5kLnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSA3KSwKICAgICAgICBsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gNykpIAoKQWdlX3N0cmVzc19FUwpgYGAKCiMjIyMgU3RyZXNzIGR1cmF0aW9uCgpgYGAge3IsIGZpZy53aWR0aD0xMCwgZmlnLmhlaWdodD03fQpWQ1ZfRVM0IDwtIGltcHV0ZV9jb3ZhcmlhbmNlX21hdHJpeCh2aSA9IGRhdDQkbG5SUlZfRVMsIGNsdXN0ZXIgPSBkYXQ0JFN0dWR5X0lELCByID0gMC41KQoKbW9kX0VTNiA8LXJtYS5tdih5aSA9IGxuUlJfRVNhLCBWID0gVkNWX0VTNCwgbW9kID0gflN0cmVzc19kdXJhdGlvbi0xLCByYW5kb20gPSBsaXN0KH4xfFN0dWR5X0lELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH4xfEVTX0lELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH4xfFN0cmFpbiksCiAgICAgICAgICAgICAgICAgdGVzdCA9ICJ0IiwKICAgICAgICAgICAgICAgICBkYXRhID0gZGF0NCkKc3VtbWFyeShtb2RfRVM2KSAKcjJfbWwobW9kX0VTNikgCgoKRHVyYXRpb25fRVM8LSBvcmNoYXJkX3Bsb3QobW9kX0VTNiwgbW9kID0gIlN0cmVzc19kdXJhdGlvbiIsIHhsYWIgPSAibG5SUiIsIGFscGhhPTAuNCkgKyAKICBnZW9tX2Vycm9yYmFyaChhZXMoeG1pbiA9IGxvd2VyUFIsIHhtYXggPSB1cHBlclBSKSwgaGVpZ2h0ID0gMCwgc2hvdy5sZWdlbmQgPSBGQUxTRSwgc2l6ZSA9IDEuMSwgYWxwaGEgPSAwLjUpICsgIyBwcmVkaWN0aW9uIGludGVydmFscwogIGdlb21fZXJyb3JiYXJoKGFlcyh4bWluID0gbG93ZXJDTCwgeG1heCA9IHVwcGVyQ0wpLCBoZWlnaHQgPSAwLjA1LCBzaG93LmxlZ2VuZCA9IEZBTFNFLCBzaXplID0gMikgKyAjIGNvbmZpZGVuY2UgaW50ZXJ2YWxzCiAgZ2VvbV9wb2ludChhZXMoZmlsbCA9IG5hbWUpLCAgc2l6ZSA9IDMsIHNoYXBlID0gMjEpKyAjIG1lYW4gZXN0aW1hdGUKICBzY2FsZV9zaXplX2NvbnRpbnVvdXMocmFuZ2UgPSBjKDEsIDcpKSsgIyBjaGFuZ2UgcG9pbnQgc2NhbGluZwogIHRoZW1lKHBhbmVsLmJvcmRlciA9IGVsZW1lbnRfcmVjdChjb2xvdXIgPSAiYmxhY2siLCBmaWxsPU5BLCBzaXplPTEuMyksICMgYm9yZGVyIGFyb3VuZCB0aGUgcGxvdAogICAgICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMCksICMgY2hhbmdlIGZvbnQgc2l6ZXMKICAgICAgICBheGlzLnRleHQueSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTApLAogICAgICAgIGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gNyksCiAgICAgICAgbGVnZW5kLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDcpKSAKCkR1cmF0aW9uX0VTCmBgYAoKIyMjIyBTb2NpYWwgZW5yaWNobWVudAoKYGBgIHtyLCBmaWcud2lkdGg9MTAsIGZpZy5oZWlnaHQ9N30KVkNWX0VTNSA8LSBpbXB1dGVfY292YXJpYW5jZV9tYXRyaXgodmkgPSBkYXQ1JGxuUlJWX0VTLCBjbHVzdGVyID0gZGF0NSRTdHVkeV9JRCwgciA9IDAuNSkKbW9kX0VTNzwtIHJtYS5tdih5aSA9IGxuUlJfRVNhLCBWID0gVkNWX0VTNSwgbW9kID0gfkVFX3NvY2lhbC0xLCByYW5kb20gPSBsaXN0KH4xfFN0dWR5X0lELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH4xfEVTX0lELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH4xfFN0cmFpbiksCiAgICAgICAgICAgICAgICAgdGVzdCA9ICJ0IiwKICAgICAgICAgICAgICAgICBkYXRhID0gZGF0NSkKCnN1bW1hcnkobW9kX0VTNykKcjJfbWwobW9kX0VTNykgCgpTb2NpYWxfRVMgPC0gb3JjaGFyZF9wbG90KG1vZF9FUzcsIG1vZCA9ICJFRV9zb2NpYWwiLCB4bGFiID0gImxuUlIiLCBhbHBoYT0wLjQpICsgCiAgZ2VvbV9lcnJvcmJhcmgoYWVzKHhtaW4gPSBsb3dlclBSLCB4bWF4ID0gdXBwZXJQUiksIGhlaWdodCA9IDAsIHNob3cubGVnZW5kID0gRkFMU0UsIHNpemUgPSAxLjEsIGFscGhhID0gMC41KSArICMgcHJlZGljdGlvbiBpbnRlcnZhbHMKICBnZW9tX2Vycm9yYmFyaChhZXMoeG1pbiA9IGxvd2VyQ0wsIHhtYXggPSB1cHBlckNMKSwgaGVpZ2h0ID0gMC4wNSwgc2hvdy5sZWdlbmQgPSBGQUxTRSwgc2l6ZSA9IDIpICsgIyBjb25maWRlbmNlIGludGVydmFscwogIGdlb21fcG9pbnQoYWVzKGZpbGwgPSBuYW1lKSwgIHNpemUgPSAzLCBzaGFwZSA9IDIxKSsgIyBtZWFuIGVzdGltYXRlCiAgc2NhbGVfc2l6ZV9jb250aW51b3VzKHJhbmdlID0gYygxLCA3KSkrICMgY2hhbmdlIHBvaW50IHNjYWxpbmcKICB0aGVtZShwYW5lbC5ib3JkZXIgPSBlbGVtZW50X3JlY3QoY29sb3VyID0gImJsYWNrIiwgZmlsbD1OQSwgc2l6ZT0xLjMpLCAjIGJvcmRlciBhcm91bmQgdGhlIHBsb3QKICAgICAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTApLCAjIGNoYW5nZSBmb250IHNpemVzCiAgICAgICAgYXhpcy50ZXh0LnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEwKSwKICAgICAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDcpLAogICAgICAgIGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSA3KSkgCgpTb2NpYWxfRVMKYGBgCgojIyMjIEV4ZXJjaXNlIGVucmljaG1lbnQKCmBgYCB7ciwgZmlnLndpZHRoPTEwLCBmaWcuaGVpZ2h0PTd9Cm1vZF9FUzg8LSBybWEubXYoeWkgPSBsblJSX0VTYSwgViA9IFZDVl9FUywgbW9kID0gfkVFX2V4ZXJjaXNlLTEsIHJhbmRvbSA9IGxpc3QofjF8U3R1ZHlfSUQsIAogICAgfjF8RVNfSUQsCiAgICB+MXxTdHJhaW4pLAogICAgIHRlc3QgPSAidCIsCiAgICAgZGF0YSA9IGRhdCkKCnN1bW1hcnkobW9kX0VTOCkKcjJfbWwobW9kX0VTOCkgCgpFeGVyY2lzZV9FUyA8LSBvcmNoYXJkX3Bsb3QobW9kX0VTOCwgbW9kID0gIkVFX2V4ZXJjaXNlIiwgeGxhYiA9ICJsblJSIiwgYWxwaGE9MC40KSArIAogIGdlb21fZXJyb3JiYXJoKGFlcyh4bWluID0gbG93ZXJQUiwgeG1heCA9IHVwcGVyUFIpLCBoZWlnaHQgPSAwLCBzaG93LmxlZ2VuZCA9IEZBTFNFLCBzaXplID0gMS4xLCBhbHBoYSA9IDAuNSkgKyAjIHByZWRpY3Rpb24gaW50ZXJ2YWxzCiAgZ2VvbV9lcnJvcmJhcmgoYWVzKHhtaW4gPSBsb3dlckNMLCB4bWF4ID0gdXBwZXJDTCksIGhlaWdodCA9IDAuMDUsIHNob3cubGVnZW5kID0gRkFMU0UsIHNpemUgPSAyKSArICMgY29uZmlkZW5jZSBpbnRlcnZhbHMKICBnZW9tX3BvaW50KGFlcyhmaWxsID0gbmFtZSksICBzaXplID0gMywgc2hhcGUgPSAyMSkrICMgbWVhbiBlc3RpbWF0ZQogIHNjYWxlX3NpemVfY29udGludW91cyhyYW5nZSA9IGMoMSwgNykpKyAjIGNoYW5nZSBwb2ludCBzY2FsaW5nCiAgdGhlbWUocGFuZWwuYm9yZGVyID0gZWxlbWVudF9yZWN0KGNvbG91ciA9ICJibGFjayIsIGZpbGw9TkEsIHNpemU9MS4zKSwgIyBib3JkZXIgYXJvdW5kIHRoZSBwbG90CiAgICAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTApLCAjIGNoYW5nZSBmb250IHNpemVzCiAgICAgICAgYXhpcy50ZXh0LnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEwKSwKICAgICAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDcpLAogICAgICAgIGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSA3KSkgCgpFeGVyY2lzZV9FUwpgYGAKCiMjIyMgT3JkZXIgdG8gdHJlYXRtZW50IGV4cG9zdXJlCgpgYGAge3IsIGZpZy53aWR0aD0xMCwgZmlnLmhlaWdodD03fQptb2RfRVM5IDwtIHJtYS5tdih5aSA9IGxuUlJfRVNhLCBWID0gVkNWX0VTLCBtb2QgPSB+RXhwb3N1cmVfb3JkZXIgLTEsIHJhbmRvbSA9IGxpc3QofjF8U3R1ZHlfSUQsIAogICAgfjF8RVNfSUQsCiAgICB+MXxTdHJhaW4pLAogICAgIHRlc3QgPSAidCIsCiAgICAgZGF0YSA9IGRhdCkKCnN1bW1hcnkobW9kX0VTOSkKcjJfbWwobW9kX0VTOSkKCk9yZGVyX0VTIDwtIG9yY2hhcmRfcGxvdChtb2RfRVM5LCBtb2QgPSAiRXhwb3N1cmVfb3JkZXIiLCB4bGFiID0gImxuUlIiLCBhbHBoYT0wLjQpICsgCiAgZ2VvbV9lcnJvcmJhcmgoYWVzKHhtaW4gPSBsb3dlclBSLCB4bWF4ID0gdXBwZXJQUiksIGhlaWdodCA9IDAsIHNob3cubGVnZW5kID0gRkFMU0UsIHNpemUgPSAxLjEsIGFscGhhID0gMC41KSArICMgcHJlZGljdGlvbiBpbnRlcnZhbHMKICBnZW9tX2Vycm9yYmFyaChhZXMoeG1pbiA9IGxvd2VyQ0wsIHhtYXggPSB1cHBlckNMKSwgaGVpZ2h0ID0gMC4wNSwgc2hvdy5sZWdlbmQgPSBGQUxTRSwgc2l6ZSA9IDIpICsgIyBjb25maWRlbmNlIGludGVydmFscwogIGdlb21fcG9pbnQoYWVzKGZpbGwgPSBuYW1lKSwgIHNpemUgPSAzLCBzaGFwZSA9IDIxKSsgIyBtZWFuIGVzdGltYXRlCiAgc2NhbGVfc2l6ZV9jb250aW51b3VzKHJhbmdlID0gYygxLCA3KSkrICMgY2hhbmdlIHBvaW50IHNjYWxpbmcKICB0aGVtZShwYW5lbC5ib3JkZXIgPSBlbGVtZW50X3JlY3QoY29sb3VyID0gImJsYWNrIiwgZmlsbD1OQSwgc2l6ZT0xLjMpLCAjIGJvcmRlciBhcm91bmQgdGhlIHBsb3QKICAgICAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTApLCAjIGNoYW5nZSBmb250IHNpemVzCiAgICAgICAgYXhpcy50ZXh0LnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEwKSwKICAgICAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDcpLAogICAgICAgIGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSA3KSkgCgpPcmRlcl9FUyAKYGBgCgojIyMjIEFnZSBvZiBlbnJpY2htZW50CgpgYGAge3IsIGZpZy53aWR0aD0xMCwgZmlnLmhlaWdodD03fQpWQ1ZfRVM2IDwtIGltcHV0ZV9jb3ZhcmlhbmNlX21hdHJpeCh2aSA9IGRhdDYkbG5SUlZfRVMsIGNsdXN0ZXIgPSBkYXQ2JFN0dWR5X0lELCByID0gMC41KQoKbW9kX0VTMTAgPC0gcm1hLm12KHlpID0gbG5SUl9FU2EsIFYgPSBWQ1ZfRVM2LCBtb2QgPSB+QWdlX0VFX2V4cG9zdXJlLTEsIHJhbmRvbSA9IGxpc3QofjF8U3R1ZHlfSUQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH4xfEVTX0lELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB+MXxTdHJhaW4pLAogICAgICAgICAgICAgICAgIHRlc3QgPSAidCIsCiAgICAgICAgICAgICAgICAgZGF0YSA9IGRhdDYpCgpzdW1tYXJ5KG1vZF9FUzEwKSAKcjJfbWwobW9kX0VTMTApIAoKQWdlX2VucmljaG1lbnRfRVMgPC0gb3JjaGFyZF9wbG90KG1vZF9FUzEwLCBtb2QgPSAiQWdlX0VFX2V4cG9zdXJlIiwgeGxhYiA9ICJsblJSIiwgYWxwaGE9MC40KSArIAogIGdlb21fZXJyb3JiYXJoKGFlcyh4bWluID0gbG93ZXJQUiwgeG1heCA9IHVwcGVyUFIpLCBoZWlnaHQgPSAwLCBzaG93LmxlZ2VuZCA9IEZBTFNFLCBzaXplID0gMS4xLCBhbHBoYSA9IDAuNSkgKyAjIHByZWRpY3Rpb24gaW50ZXJ2YWxzCiAgZ2VvbV9lcnJvcmJhcmgoYWVzKHhtaW4gPSBsb3dlckNMLCB4bWF4ID0gdXBwZXJDTCksIGhlaWdodCA9IDAuMDUsIHNob3cubGVnZW5kID0gRkFMU0UsIHNpemUgPSAyKSArICMgY29uZmlkZW5jZSBpbnRlcnZhbHMKICBnZW9tX3BvaW50KGFlcyhmaWxsID0gbmFtZSksICBzaXplID0gMywgc2hhcGUgPSAyMSkrICMgbWVhbiBlc3RpbWF0ZQogIHNjYWxlX3NpemVfY29udGludW91cyhyYW5nZSA9IGMoMSwgNykpKyAjIGNoYW5nZSBwb2ludCBzY2FsaW5nCiAgdGhlbWUocGFuZWwuYm9yZGVyID0gZWxlbWVudF9yZWN0KGNvbG91ciA9ICJibGFjayIsIGZpbGw9TkEsIHNpemU9MS4zKSwgIyBib3JkZXIgYXJvdW5kIHRoZSBwbG90CiAgICAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTApLCAjIGNoYW5nZSBmb250IHNpemVzCiAgICAgICAgYXhpcy50ZXh0LnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEwKSwKICAgICAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDcpLAogICAgICAgIGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSA3KSkgCgpBZ2VfZW5yaWNobWVudF9FUwpgYGAKCiMjIyAgTXVsdGktbW9kZXJhdG9yIG1vZGVsCgpgYGAge3IsIGV2YWwgPSBGQUxTRX0KZGF0X0VTZm0gPC0gZGF0ICU+JQogIGZpbHRlcihUeXBlX2Fzc2F5ICVpbiUgYygiUmVjb2duaXRpb24iLCAiSGFiaXR1YXRpb24iLCAiQ29uZGl0aW9uaW5nIiksCiAgICAgICAgIFR5cGVfcmVpbmZvcmNlbWVudCAlaW4lIGMoIkFwcGV0aXRpdmUiLCAiQXZlcnNpdmUiLCAiTm90IGFwcGxpY2FibGUiKSwKICAgICAgICAgRUVfc29jaWFsICVpbiUgYygiU29jaWFsIiwgIk5vbi1zb2NpYWwiKSwKICAgICAgICAgQWdlX0VFX2V4cG9zdXJlICVpbiUgYygiQWR1bHQiLCAiQWRvbGVzY2VudCIpLAogICAgICAgICBUeXBlX3N0cmVzc19leHBvc3VyZSAlaW4lIGMoIlJlc3RyYWludCIsICJOb2lzZSIsICJNUyIsICJDb21iaW5hdGlvbiIpLAogICAgICAgICBTdHJlc3NfZHVyYXRpb24gJWluJSBjKCJDaHJvbmljIiwgIkFjdXRlIiksIAogICAgICAgICBBZ2Vfc3RyZXNzX2V4cG9zdXJlICVpbiUgYygiUHJlbmF0YWwiLCAiRWFybHkgcG9zdG5hdGFsIiwgIkFkdWx0IikpCgpWQ1ZfRVNmbSA8LSBpbXB1dGVfY292YXJpYW5jZV9tYXRyaXgodmkgPSBkYXRfRVNmbSRsblJSVl9FUywgY2x1c3RlciA9IGRhdF9FU2ZtJFN0dWR5X0lELCByID0gMC41KQogICAgICAgICAgICAgICAgIAptb2RfRVNmbSA8LSBybWEubXYoeWkgPSBsblJSX1NhLCBWID0gVkNWX0VTZm0sIG1vZCA9IH5UeXBlX2Fzc2F5LTEgKyBMZWFybmluZ192c19tZW1vcnkgKyBUeXBlX3JlaW5mb3JjZW1lbnQgKyBFRV9zb2NpYWwgKyBFRV9leGVyY2lzZSArIEFnZV9FRV9leHBvc3VyZSArIFR5cGVfc3RyZXNzX2V4cG9zdXJlICsgQWdlX3N0cmVzc19leHBvc3VyZSArIFN0cmVzc19kdXJhdGlvbiArIEV4cG9zdXJlX29yZGVyLCByYW5kb20gPSAgIGxpc3QofjF8U3R1ZHlfSUQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH4xfEVTX0lELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB+MXxTdHJhaW4pLAogICAgICAgICAgICAgICAgICAgIHRlc3QgPSAidCIsCiAgICAgICAgICAgICAgICAgZGF0YSA9IGRhdF9FU2ZtKQojc3VtbWFyeShtb2RfRVNmbSkKI3IyX21sKG1vZF9FU2ZtKSAKCgpyZXNfRVNmbSA8LSBkcmVkZ2UobW9kX0VTZm0sIHRyYWNlPTIpCnNhdmVSRFMocmVzX0VTZm0sIGZpbGUgPSBoZXJlKCJSZGF0YSIsICJyZXNfRVNmbS5yZHMiKSkKIyBhbHNvIHNhdmluZyB0aGUgZnVsbCBtb2RlbCBhbmQgZGF0YQpzYXZlUkRTKG1vZF9FU2ZtLCBmaWxlID0gaGVyZSgiUmRhdGEiLCAibW9kX0VTZm0ucmRzIikpCnNhdmVSRFMoZGF0X0VTZm0sIGZpbGUgPSBoZXJlKCJSZGF0YSIsICJkYXRfRVNmbS5yZHMiKSkKYGBgCgoKYGBge3J9CmRhdF9FU2ZtIDwtIHJlYWRSRFMoZmlsZSA9IGhlcmUoIlJkYXRhIiwgImRhdF9FU2ZtLnJkcyIpKQptb2RfRVNmbSA8LSByZWFkUkRTKGZpbGUgPSBoZXJlKCJSZGF0YSIsICJtb2RfRVNmbS5yZHMiKSkKcmVzX0VTZm0gPC0gcmVhZFJEUyhmaWxlID0gaGVyZSgiUmRhdGEiLCAicmVzX0VTZm0ucmRzIikpCnJlc19FU2ZtMjwtIHN1YnNldChyZXNfRVNmbSwgZGVsdGEgPD0gNiwgcmVjYWxjLndlaWdodHM9RkFMU0UpCmltcG9ydGFuY2UocmVzX0VTZm0yKSAKYGBgCgojIyMgUHVibGljYXRpb24gYmlhcyAmIHNlbnNpdGl2aXR5IGFuYWx5c2lzCgojIyMjIFB1YmxpY2F0aW9uIGJpYXMKCmBgYCB7ciwgcmVzdWx0cyA9ICdoaWRlJ30KRnVubmVsX0VTPC1mdW5uZWwobW9kX0VTZm0sIHhsYWIgPSAibG5SUiIsIHlsYWIgPSAiU3RhbmRhcmQgRXJyb3IiKQpGdW5uZWxfRVMKI3llYXIgcHVibGlzaGVkIHdhcyBzY2FsZWQgcHJldmlvdXNseSB1bmRlciBzdHJlc3MgUEIKCmRhdF9FU2ZtJHNxcnRfaW52X2VfbiA8LSB3aXRoKGRhdF9FU2ZtLCBzcXJ0KDEvQ0NfbiArIDEvRUNfbiArIDEvRVNfbiArIDEvQ1NfbikpCgpQQl9NUl9FUzwtIHJtYS5tdihsblJSX0VTYSwgbG5SUlZfRVMsIG1vZHMgPSB+MSArIHNxcnRfaW52X2VfbiArICBZZWFyX3B1Ymxpc2hlZCArIExlYXJuaW5nX3ZzX21lbW9yeSArIFR5cGVfYXNzYXkgKyBUeXBlX3JlaW5mb3JjZW1lbnQgKyBFRV9zb2NpYWwgKyBFRV9leGVyY2lzZSArIEFnZV9zdHJlc3NfZXhwb3N1cmUsIHJhbmRvbSA9IGxpc3QofjF8U3R1ZHlfSUQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB+MXxFU19JRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH4xfFN0cmFpbiksIG1ldGhvZCA9ICJSRU1MIiwgdGVzdCA9ICJ0IiwgCiAgICBkYXRhID0gZGF0X0VTZm0pCgplc3RpbWF0ZXNfUEJfTVJfRVM8LSBlc3RpbWF0ZXMuQ0koUEJfTVJfRVMpCiNlc3RpbWF0ZXNfUEJfTVJfRVMKCmBgYAoKIyMjIyBMZWF2ZS1vbmUtb3V0IGFuYWx5c2lzCgpgYGAge3IsIGV2YWwgPSBGQUxTRX0KZGF0JFN0dWR5X0lEIDwtIGFzLmZhY3RvcihkYXQkU3R1ZHlfSUQpCgpMZWF2ZU9uZU91dF9lZmZlY3RzaXplIDwtIGxpc3QoKQpmb3IoaSBpbiAxOmxlbmd0aChsZXZlbHMoZGF0JFN0dWR5X0lEKSkpewogIExlYXZlT25lT3V0X2VmZmVjdHNpemVbW2ldXSA8LSBybWEubXYoeWkgPSBsblJSX0VhLCBWID0gbG5SUlZfRSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYW5kb20gPSBsaXN0KH4xIHwgU3R1ZHlfSUQsfjF8IEVTX0lELCB+MSB8IFN0cmFpbiksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kID0gIlJFTUwiLCBkYXRhID0gZGF0W2RhdCRTdHVkeV9JRAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICE9IGxldmVscyhkYXQkU3R1ZHlfSUQpW2ldLCBdKX0KCgojIHdyaXRpbmcgZnVuY3Rpb24gZm9yIGV4dHJhY3RpbmcgZXN0LCBjaS5sYiwgYW5kIGNpLnViIGZyb20gYWxsIG1vZGVscwplc3QuZnVuYyA8LSBmdW5jdGlvbihtb2RfRTApewogIGRmIDwtIGRhdGEuZnJhbWUoZXN0ID0gbW9kX0UwJGIsIGxvd2VyID0gbW9kX0UwJGNpLmxiLCB1cHBlciA9IG1vZF9FMCRjaS51YikKICByZXR1cm4oZGYpCn0KCgojdXNpbmcgZHBseXIgdG8gZm9ybSBkYXRhIGZyYW1lCk1BX0NWUl9FUyA8LSBsYXBwbHkoTGVhdmVPbmVPdXRfZWZmZWN0c2l6ZSwgZnVuY3Rpb24oeCkgZXN0LmZ1bmMoeCkpJT4lIGJpbmRfcm93cyAlPiUgbXV0YXRlKGxlZnRfb3V0ID0gbGV2ZWxzKGRhdCRTdHVkeV9JRCkpCgpzYXZlUkRTKE1BX0NWUl9FUywgLGZpbGUgPSBoZXJlKCJSZGF0YSIsICJNQV9DVlJfRVMucmRzIikpCgpgYGAKCmBgYCB7cn0KTUFfQ1ZSX0VTPC0gcmVhZFJEUyhoZXJlKCJSZGF0YSIsICJNQV9DVlJfRVMucmRzIikpCgojdGVsbGluZyBnZ3Bsb3QgdG8gc3RvcCByZW9yZGVyaW5nIGZhY3RvcnMKTUFfQ1ZSX0VTJGxlZnRfb3V0PC0gYXMuZmFjdG9yKE1BX0NWUl9FUyRsZWZ0X291dCkKTUFfQ1ZSX0VTJGxlZnRfb3V0PC1mYWN0b3IoTUFfQ1ZSX0VTJGxlZnRfb3V0LCBsZXZlbHMgPSBNQV9DVlJfRVMkbGVmdF9vdXQpCgojcGxvdHRpbmcKbGVhdmVvbmVvdXRfRVMgPC0gZ2dwbG90KE1BX0NWUl9FUykgKwogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDAsIGx0eSA9IDIsIGx3ZCA9IDEpICsKICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSBtb2RfRTAkY2kubGIsIGx0eSA9IDMsIGx3ZCA9IDAuNzUsIGNvbG91ciA9ICJibGFjayIpICsKICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSBtb2RfRTAkYiwgbHR5ID0gMSwgbHdkID0gMC43NSwgY29sb3VyID0gImJsYWNrIikgKwogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IG1vZF9FMCRjaS51YiwgbHR5ID0gMywgbHdkID0gMC43NSwgY29sb3VyID0gImJsYWNrIikgKwogIGdlb21fcG9pbnRyYW5nZShhZXMoeCA9IGxlZnRfb3V0LCB5ID0gZXN0LCB5bWluID0gbG93ZXIsIHltYXggPSB1cHBlcikpICsKICB4bGFiKCJTdHVkeSBsZWZ0IG91dCIpICsgCiAgeWxhYigibG5SUiwgOTUlIENJIikgKyAKICBjb29yZF9mbGlwKCkgKwogIHRoZW1lKHBhbmVsLmdyaWQubWlub3IgPSBlbGVtZW50X2JsYW5rKCkpKwogIHRoZW1lX2J3KCkgKyB0aGVtZShwYW5lbC5ncmlkLm1ham9yID0gZWxlbWVudF9ibGFuaygpKSArCiAgdGhlbWUocGFuZWwuZ3JpZC5taW5vci54ID0gZWxlbWVudF9ibGFuaygpICkgKwogIHRoZW1lKGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KHNpemUgPSA2KSkKCmxlYXZlb25lb3V0X0VTCgpkYXQkU3R1ZHlfSUQgPC0gYXMuaW50ZWdlcihkYXQkU3R1ZHlfSUQpCmBgYAoKIyMjIENvbWJpbmVkIG9yY2hhcmQgcGxvdAoKYGBgIHtyLCBmaWcud2lkdGg9MTAsIGZpZy5oZWlnaHQ9N30KbW9kX2xpc3QxIDwtIGxpc3QobW9kX0UwLCBtb2RfUzAsIG1vZF9FUzApCgptb2RfcmVzMSA8LSBsYXBwbHkobW9kX2xpc3QxLCBmdW5jdGlvbih4KSBtb2RfcmVzdWx0cyh4LCBtb2QgPSAiSW50IikpCgptZXJnZWQxIDwtIHN1Ym1lcmdlKG1vZF9yZXMxW1szXV0sIG1vZF9yZXMxW1syXV0sICBtb2RfcmVzMVtbMV1dLCBtaXggPSBUKQptZXJnZWQxJG1vZF90YWJsZSRuYW1lIDwtIGZhY3RvcihtZXJnZWQxJG1vZF90YWJsZSRuYW1lLCBsZXZlbHMgPSBjKCJJbnRyY3B0MSIsIAogICAgIkludHJjcHQyIiwgIkludHJjcHQzIiksIAogICAgbGFiZWxzID0gcmV2KGMoIkVucmljaG1lbnQgTUUiLCAiU3RyZXNzIE1FIiwgIkludGVyYWN0aW9uIikpKQoKbWVyZ2VkMSRkYXRhJG1vZGVyYXRvciA8LSBmYWN0b3IobWVyZ2VkMSRkYXRhJG1vZGVyYXRvciwgbGV2ZWxzID0gYygiSW50cmNwdDEiLCAKICAgICJJbnRyY3B0MiIsICJJbnRyY3B0MyIpLCAKICAgIGxhYmVscyA9IHJldihjKCJFbnJpY2htZW50IE1FIiwgIlN0cmVzcyBNRSIsICJJbnRlcmFjdGlvbiIpKSkKCm9yY2hhcmQxPC0gb3JjaGFyZF9wbG90KG1lcmdlZDEsIG1vZCA9ICJJbnQiLCB4bGFiID0gImxuUlIiLCBhbmdsZSA9IDApICsgCiAgZ2VvbV9lcnJvcmJhcmgoYWVzKHhtaW4gPSBsb3dlclBSLCB4bWF4ID0gdXBwZXJQUiksIGhlaWdodCA9IDAsIHNob3cubGVnZW5kID0gRkFMU0UsIHNpemUgPSAxLjEsIGFscGhhID0gMC41KSArICMgcHJlZGljdGlvbiBpbnRlcnZhbHMKICBnZW9tX2Vycm9yYmFyaChhZXMoeG1pbiA9IGxvd2VyQ0wsIHhtYXggPSB1cHBlckNMKSwgaGVpZ2h0ID0gMC4wNSwgc2hvdy5sZWdlbmQgPSBGQUxTRSwgc2l6ZSA9IDIpICsgIyBjb25maWRlbmNlIGludGVydmFscyAKICB4bGltKC0yLDQuNSkgKwogIGdlb21fcG9pbnQoYWVzKGZpbGwgPSBuYW1lKSwgIHNpemUgPSA0LCBzaGFwZSA9IDIxKSsgIyBtZWFuIGVzdGltYXRlCiAgc2NhbGVfc2l6ZV9jb250aW51b3VzKHJhbmdlID0gYygxLCA3KSkrICMgY2hhbmdlIHBvaW50IHNjYWxpbmcgKwogIHNjYWxlX2NvbG91cl9tYW51YWwodmFsdWVzID0gYygiIzAwQUVFRiIsIiMwMEE2NTEiLCIjRUQxQzI0IikpKyAjIGNoYW5nZSBjb2xvdXJzCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzPWMoIiMwMEFFRUYiLCIjMDBBNjUxIiwiI0VEMUMyNCIpKSsKICB0aGVtZShwYW5lbC5ib3JkZXIgPSBlbGVtZW50X3JlY3QoY29sb3VyID0gImJsYWNrIiwgZmlsbD1OQSwgc2l6ZT0xLjMpLCAjIGJvcmRlciBhcm91bmQgdGhlIHBsb3QKICAgICAgICB0ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNSksICMgY2hhbmdlIGZvbnQgc2l6ZXMKICAgICAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEwKSwKICAgICAgICBsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTApKSAKCm9yY2hhcmQxCmBgYAoKIyMgJ1BhaXJ3aXNlJyBlZmZlY3Qgc2l6ZXMgey50YWJzZXR9CgojIyMgRW5yaWNobWVudCByZWxhdGl2ZSB0byBjb250cm9sCgpgYGAge3IsIGZpZy53aWR0aD0xMCwgZmlnLmhlaWdodD03fQoKVkNWX0UyMCA8LSBpbXB1dGVfY292YXJpYW5jZV9tYXRyaXgodmkgPSBkYXQkbG5SUlZfRTIsIGNsdXN0ZXIgPSBkYXQkU3R1ZHlfSUQsIHIgPSAwLjUpCgptb2RfRTIwIDwtIHJtYS5tdih5aSA9IGxuUlJfRTJhLCBWID0gVkNWX0UyMCwgcmFuZG9tID0gbGlzdCh+MXxTdHVkeV9JRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH4gMXxTdHJhaW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB+MXxFU19JRCksCiAgICAgICAgICAgICAgICAgdGVzdCA9ICJ0IiwgCiAgICAgICAgICAgICAgICAgZGF0YSA9IGRhdCwgCiAgICAgICAgICAgICAgICAgY29udHJvbD1saXN0KG9wdGltaXplcj0ib3B0aW0iLCBvcHRtZXRob2Q9Ik5lbGRlci1NZWFkIikpCgpzdW1tYXJ5KG1vZF9FMjApIAppMl9tbChtb2RfRTIwKSAKCm9yY2hhcmRfcGxvdChtb2RfRTIwLCBtb2QgPSAiSW50IiwgeGxhYiA9ICJsblJSIikKYGBgCgojIyMgU3RyZXNzIHJlbGF0aXZlIHRvIGNvbnRyb2wKCmBgYCB7ciwgZmlnLndpZHRoPTEwLCBmaWcuaGVpZ2h0PTd9ClZDVl9TMjAgPC0gaW1wdXRlX2NvdmFyaWFuY2VfbWF0cml4KHZpID0gZGF0JGxuUlJWX1MyLCBjbHVzdGVyID0gZGF0JFN0dWR5X0lELCByID0gMC41KQoKbW9kX1MyMCA8LSBybWEubXYoeWkgPSBsblJSX1MyYSwgViA9IFZDVl9TMjAsIHJhbmRvbSA9IGxpc3QofjF8U3R1ZHlfSUQsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfiAxfFN0cmFpbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH4xfEVTX0lEKSwKICAgICAgICAgICAgICAgICB0ZXN0ID0gInQiLAogICAgICAgICAgICAgICAgIGRhdGEgPSBkYXQpCgpzdW1tYXJ5KG1vZF9TMjApIAppMl9tbChtb2RfUzIwKSAKIApvcmNoYXJkX3Bsb3QobW9kX1MyMCwgbW9kID0gIkludCIsIHhsYWIgPSAibG5SUiIpCmBgYAoKIyMjIEVucmljaG1lbnQgKyBzdHJlc3MgcmVsYXRpdmUgdG8gY29udHJvbAoKYGBgIHtyLCBmaWcud2lkdGg9MTAsIGZpZy5oZWlnaHQ9N30KVkNWX0VTMjAgPC0gaW1wdXRlX2NvdmFyaWFuY2VfbWF0cml4KHZpID0gZGF0JGxuUlJWX0VTMiwgY2x1c3RlciA9IGRhdCRTdHVkeV9JRCwgciA9IDAuNSkKCm1vZF9FUzIwIDwtIHJtYS5tdih5aSA9IGxuUlJfRVMyYSwgViA9IFZDVl9FUzIwLCByYW5kb20gPSBsaXN0KH4xfFN0dWR5X0lELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfiAxfFN0cmFpbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH4xfEVTX0lEKSwKICAgICAgICAgICAgICAgICB0ZXN0ID0gInQiLAogICAgICAgICAgICAgICAgIGRhdGEgPSBkYXQpCnN1bW1hcnkobW9kX0VTMjApIAppMl9tbChtb2RfRVMyMCkgCgpvcmNoYXJkX3Bsb3QobW9kX0VTMjAsIG1vZCA9ICJJbnQiLCB4bGFiID0gImxuUlIiKQpgYGAKCiMjIyBFbnJpY2htZW50ICsgc3RyZXNzIHJlbGF0aXZlIHRvIHN0cmVzcwoKYGBgIHtyLCBmaWcud2lkdGg9MTAsIGZpZy5oZWlnaHQ9N30KVkNWX0UzMCA8LSBpbXB1dGVfY292YXJpYW5jZV9tYXRyaXgodmkgPSBkYXQkbG5SUlZfRTMsIGNsdXN0ZXIgPSBkYXQkU3R1ZHlfSUQsIHIgPSAwLjUpCgptb2RfRTMwIDwtIHJtYS5tdih5aSA9IGxuUlJfRTNhLCBWID0gVkNWX0UzMCwgcmFuZG9tID0gbGlzdCh+MXxTdHVkeV9JRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH4gMXxTdHJhaW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB+MXxFU19JRCksCiAgICAgICAgICAgICAgICAgIHRlc3QgPSAidCIsCiAgICAgICAgICAgICAgICAgIGRhdGEgPSBkYXQpCnN1bW1hcnkobW9kX0UzMCkgCmkyX21sKG1vZF9FMzApIAoKb3JjaGFyZF9wbG90KG1vZF9FMzAsIG1vZCA9ICJJbnQiLCB4bGFiID0gImxuUlIiKQpgYGAKCiMjIyBFbnJpY2htZW50ICsgc3RyZXNzIHJlbGF0aXZlIHRvIGVucmljaG1lbnQKCmBgYCB7ciwgZmlnLndpZHRoPTEwLCBmaWcuaGVpZ2h0PTd9ClZDVl9TMzAgPC0gaW1wdXRlX2NvdmFyaWFuY2VfbWF0cml4KHZpID0gZGF0JGxuUlJWX1MzLCBjbHVzdGVyID0gZGF0JFN0dWR5X0lELCByID0gMC41KQoKbW9kX1MzMCA8LSBybWEubXYoeWkgPSBsblJSX1MzYSwgViA9IFZDVl9TMzAsIHJhbmRvbSA9IGxpc3QofjF8U3R1ZHlfSUQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB+IDF8U3RyYWluLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfjF8RVNfSUQpLAogICAgICAgICAgICAgICAgICB0ZXN0ID0gInQiLAogICAgICAgICAgICAgICAgICBkYXRhID0gZGF0LAogICAgICAgICAgICAgICAgICAgY29udHJvbD1saXN0KG9wdGltaXplcj0ib3B0aW0iLCBvcHRtZXRob2Q9Ik5lbGRlci1NZWFkIikpCnN1bW1hcnkobW9kX1MzMCkgCmkyX21sKG1vZF9TMzApIAoKb3JjaGFyZF9wbG90KG1vZF9TMzAsIG1vZCA9ICJJbnQiLCB4bGFiID0gImxuUlIiKQpgYGAKCmBgYCB7ciwgZmlnLndpZHRoPTEwLCBmaWcuaGVpZ2h0PTcsIH0KCm1vZF9saXN0MiA8LSBsaXN0KG1vZF9TMzAsIG1vZF9FMzAsIG1vZF9FUzIwLCBtb2RfUzIwLCBtb2RfRTIwKSAjcmVhcnJhbmdlZCB0aGUgb3JkZXIgc28gdGhhdCBpdCBtYXRjaGVzIGludGV4dCByZXN1bHRzCgptb2RfcmVzMiA8LSBsYXBwbHkobW9kX2xpc3QyLCBmdW5jdGlvbih4KSBtb2RfcmVzdWx0cyh4LCBtb2QgPSAiSW50IikpCgptZXJnZWQyIDwtIHN1Ym1lcmdlKG1vZF9yZXMyW1sxXV0sIG1vZF9yZXMyW1syXV0sICBtb2RfcmVzMltbM11dLCBtb2RfcmVzMltbNF1dLCAgbW9kX3JlczJbWzVdXSwgbWl4ID0gVCkKCm1lcmdlZDIkbW9kX3RhYmxlJG5hbWUgPC0gZmFjdG9yKG1lcmdlZDIkbW9kX3RhYmxlJG5hbWUsIGxldmVscyA9IGMoIkludHJjcHQxIiwgCiAgICAiSW50cmNwdDIiLCAiSW50cmNwdDMiLCAiSW50cmNwdDQiLCAiSW50cmNwdDUiKSwgCiAgICBsYWJlbHMgPSByZXYoYygiRUMvQ0MiLCAiQ1MvQ0MiLCAiRVMvQ0MiLCAiRVMvQ1MiLCAiRVMvRUMiKSkpCgptZXJnZWQyJGRhdGEkbW9kZXJhdG9yIDwtIGZhY3RvcihtZXJnZWQyJGRhdGEkbW9kZXJhdG9yLCBsZXZlbHMgPSBjKCJJbnRyY3B0MSIsIAogICAgIkludHJjcHQyIiwgIkludHJjcHQzIiwgIkludHJjcHQ0IiwgIkludHJjcHQ1IiksIAogICAgbGFiZWxzID0gcmV2KGMoIkVDL0NDIiwgIkNTL0NDIiwgIkVTL0NDIiwgIkVTL0NTIiwgIkVTL0VDIikpKQoKb3JjaGFyZDIgPC0gb3JjaGFyZF9wbG90KG1lcmdlZDIsIG1vZCA9ICJJbnQiLCB4bGFiID0gImxuUlIiLCBhbmdsZSA9IDApICsgCiAgZ2VvbV9lcnJvcmJhcmgoYWVzKHhtaW4gPSBsb3dlclBSLCB4bWF4ID0gdXBwZXJQUiksIGhlaWdodCA9IDAsIHNob3cubGVnZW5kID0gRkFMU0UsIHNpemUgPSAxLjEsIGFscGhhID0gMC41KSArICMgcHJlZGljdGlvbiBpbnRlcnZhbHMKICBnZW9tX2Vycm9yYmFyaChhZXMoeG1pbiA9IGxvd2VyQ0wsIHhtYXggPSB1cHBlckNMKSwgaGVpZ2h0ID0gMC4wNSwgc2hvdy5sZWdlbmQgPSBGQUxTRSwgc2l6ZSA9IDIpICsgIyBjb25maWRlbmNlIGludGVydmFscyAKICB4bGltKC0yLDQuNSkgKwogIGdlb21fcG9pbnQoYWVzKGZpbGwgPSBuYW1lKSwgIHNpemUgPSA0LCBzaGFwZSA9IDIxKSsgIyBtZWFuIGVzdGltYXRlCiAgc2NhbGVfc2l6ZV9jb250aW51b3VzKHJhbmdlID0gYygxLCA3KSkrICMgY2hhbmdlIHBvaW50IHNjYWxpbmcKICBzY2FsZV9jb2xvdXJfbWFudWFsKHZhbHVlcyA9IGMoIiM3QjgxQkUiLCIjRDdERjIzIiwiI0YzNzE1OCIsIiM3NUNCRjIiLCIjOTdEMkI0IikpKyAjIGNoYW5nZSBjb2xvdXJzCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzPWMoIiM3QjgxQkUiLCIjRDdERjIzIiwiI0YzNzE1OCIsIiM3NUNCRjIiLCIjOTdEMkI0IikpKwogIHRoZW1lKHBhbmVsLmJvcmRlciA9IGVsZW1lbnRfcmVjdChjb2xvdXIgPSAiYmxhY2siLCBmaWxsPU5BLCBzaXplPTEuMyksICMgYm9yZGVyIGFyb3VuZCB0aGUgcGxvdAogICAgICAgIHRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE1KSwgIyBjaGFuZ2UgZm9udCBzaXplcwogICAgICAgIGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTApLAogICAgICAgIGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMCkpIAoKYGBgCgojIyBGaWd1cmVzCgojIyMgUGFuZWwgb2YgJ2ZvY2FsJyBFUyBhbmQgJ3BhaXJ3aXNlJyBFUyBvcmNoYXJkIHBsb3RzCmBgYCB7cn0KCgpwMSA8LSBvcmNoYXJkMSArIG9yY2hhcmQyICsgIHBsb3RfYW5ub3RhdGlvbih0YWdfbGV2ZWxzID0gJ0EnKQpwMQoKI3NhdmVkIGFzIFBERjogNiB4IDE1IGluY2hlcwpgYGAKCgojIyMgUGFuZWwgb2YgbWV0YS1yZWdyZXNzaW9ucyB7LnRhYnNldH0KCiMjIyMgRW52aXJvbm1lbnRhbCBlbnJpY2htZW50CmBgYCB7ciwgZmlnLndpZHRoPTEwLCBmaWcuaGVpZ2h0PTd9CiNFbnJpY2htZW50CkVfbW9kIDwtIChMdnNNX0UgKyBMZWFybmluZ19FICsgUmVpbmZvcmNlbWVudF9FKS8gKEFnZV9FICsgRXhlcmNpc2VfRSArIFNvY2lhbF9FKSArICBwbG90X2Fubm90YXRpb24odGFnX2xldmVscyA9ICdBJykKCkVfbW9kCiNzYXZlZCBhcyBwZGYgMTAgeCAxNSBpbmNoZXMKYGBgCgojIyMjIFN0cmVzcwpgYGAge3IsICBmaWcud2lkdGg9MTAsIGZpZy5oZWlnaHQ9N30KU19tb2QgPC0gKEx2c01fUyArIExlYXJuaW5nX1MgKyBSZWluZm9yY2VtZW50X1MpIC8gKEFnZV9TICsgU3RyZXNzb3IgKyBEdXJhdGlvbl9TKSArIHBsb3RfYW5ub3RhdGlvbih0YWdfbGV2ZWxzID0gJ0EnKQoKU19tb2QKI3NhdmVkIGFzIHBkZiAxMCB4IDE1IGluY2hlcwpgYGAKCiMjIyMgSW50ZXJhY3Rpb24KYGBgIHtyLCBmaWcud2lkdGg9MTAsIGZpZy5oZWlnaHQ9N30KRVNfbW9kIDwtIHBsb3RfZ3JpZChMdnNNX0VTLCBMZWFybmluZ19FUywgUmVpbmZvcmNlbWVudF9FUywgQWdlX2VucmljaG1lbnRfRVMsIEFnZV9zdHJlc3NfRVMsIE9yZGVyX0VTLCBFeGVyY2lzZV9FUywgU29jaWFsX0VTLCBTdHJlc3Nvcl9FUywgRHVyYXRpb25fRVMsCiAgbGFiZWxzID0gIkFVVE8iLCBuY29sID0gNSkKCkVTX21vZAojc2F2ZWQgYXMgMTAgeCAyMCBpbmNoZXMKYGBgCgojIyMgUGFuZWwgb2YgZnVubmVsIHBsb3RzCmBgYCB7ciwgZXZhbCA9IEZBTFNFfQojIEVFCgpwZGYoTlVMTCkKZGV2LmNvbnRyb2woZGlzcGxheWxpc3Q9ImVuYWJsZSIpCnBhcihtYXI9Yyg0LDQsMC4xLDApKQpBIDwtIGZ1bm5lbChtb2RfU2ZtLCB4bGFiID0gIlJlc2lkdWFscyAobG5SUikiLCB5bGFiID0gIlN0YW5kYXJkIEVycm9yIiwKICAgICAgICB4bGltID0gYygtMiwyKSwKICAgICAgICB5bGltID0gYygwLDEuMDUpKQpBIDwtIHJlY29yZFBsb3QoKQppbnZpc2libGUoZGV2Lm9mZigpKQoKIyBTdHJlc3MKCnBkZihOVUxMKQpkZXYuY29udHJvbChkaXNwbGF5bGlzdD0iZW5hYmxlIikKcGFyKG1hcj1jKDQsNCwwLjEsMCkpCkIgPC0gZnVubmVsKG1vZF9TZm0sIHhsYWIgPSAiUmVzaWR1YWxzIChsblJSKSIsIHlsYWIgPSAiU3RhbmRhcmQgRXJyb3IiLAogICAgICAgIHhsaW0gPSBjKC0yLDIpLAogICAgICAgIHlsaW0gPSBjKDAsMS4wNSkpCkIgPC0gcmVjb3JkUGxvdCgpCmludmlzaWJsZShkZXYub2ZmKCkpCgojIEludGVyYWN0aW9uCnBkZihOVUxMKQpkZXYuY29udHJvbChkaXNwbGF5bGlzdD0iZW5hYmxlIikKcGFyKG1hcj1jKDQsNCwwLjEsMCkpCkMgPC0gZnVubmVsKG1vZF9FU2ZtLCB4bGFiID0gIlJlc2lkdWFscyAobG5SUikiLCB5bGFiID0gIlN0YW5kYXJkIEVycm9yIiwKICAgICAgICB4bGltID0gYygtMiwyKSwKICAgICAgICB5bGltID0gYygwLDEuMDUpKQpDIDwtIHJlY29yZFBsb3QoKQppbnZpc2libGUoZGV2Lm9mZigpKQpgYGAKCmBgYCB7cn0KIyBwdXR0aW5nIHRvZ2V0aGVyCmdnZHJhdyhBKSArIGdnZHJhdyhCKSArIGdnZHJhdyhDKSArIHBsb3RfYW5ub3RhdGlvbih0YWdfbGV2ZWxzID0gJ0EnKQoKI3BuZyhmaWxlID0gaGVyZSgiZmlncyIsICJGaWc3X0Z1bm5lbHMucG5nIikpCiAKI2Rldi5vZmYoKQpgYGAKCmBgYHtyLCBvdXQuaGVpZ2h0PSIxMjAlIn0KI2tuaXRyOjppbmNsdWRlX2dyYXBoaWNzKGhlcmUoImZpZ3MiLCAiZnVubmVscy5wbmciKSkKYGBgCgojIE1vZGVsbGluZyB3aXRoIFNNRAoKIyMgRW52aXJvbm1lbnRhbCBFbnJpY2htZW50CgojIyMgTWV0YS1hbmFseXNpcwoKYGBgIHtyfQoKbW9kX0UwYSA8LSBybWEubXYoeWkgPSBTTURfRWEsIFYgPSBWQ1ZfRWEsIHJhbmRvbSA9IGxpc3QofjF8U3R1ZHlfSUQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH4xfEVTX0lELCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfjF8U3RyYWluKSwKICAgICAgICAgICAgICAgICB0ZXN0ID0gInQiLAogICAgICAgICAgICAgICAgIGRhdGEgPSBkYXQpCnN1bW1hcnkobW9kX0UwYSkKaTJfbWwobW9kX0UwYSkKCmBgYAoKIyMgU3RyZXNzCgojIyMgTWV0YS1hbmFseXNpcwoKYGBgIHtyLCBtZXNzYWdlID0gRkFMU0UsIHdhcm5pbmcgPSBGQUxTRX0KbW9kX1MwYSA8LSBybWEubXYoeWkgPSBTTURfU2EsIFYgPSBWQ1ZfU2EsIHJhbmRvbSA9IGxpc3QofjF8U3R1ZHlfSUQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH4xfEVTX0lELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB+MXxTdHJhaW4pLAogICAgICAgICAgICAgICAgdGVzdCA9ICJ0IiwKICAgICAgICAgICAgICAgIGRhdGEgPSBkYXQpCnN1bW1hcnkobW9kX1MwYSkgCmkyX21sKG1vZF9TMGEpIAoKYGBgCgojIyBJbnRlcmFjdGlvbgoKIyMjIE1ldGEtYW5hbHlzaXMKCmBgYCB7ciwgbWVzc2FnZSA9IEZBTFNFLCB3YXJuaW5nID0gRkFMU0V9CgoKCm1vZF9FUzBhIDwtIHJtYS5tdih5aSA9IFNNRF9FU2EsIFYgPSBWQ1ZfRVNhLCByYW5kb20gPSBsaXN0KH4xfFN0dWR5X0lELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB+MXxFU19JRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfjF8U3RyYWluKSwKICAgICAgICAgICAgICAgICAgdGVzdCA9ICJ0IiwKICAgICAgICAgICAgICAgICAgZGF0YSA9IGRhdCkKc3VtbWFyeShtb2RfRVMwYSkKaTJfbWwobW9kX0VTMGEpIAoKYGBgCgojIFJpc2sgb2YgQmlhcwpQZXJjZW50IG9mIHN0dWRpZXMgdGhhdCB1c2VkIHJhbmRvbWlzYXRpb24gYW5kIHVzZWQgYmxpbmRpbmcKYGBgIHtSfQojIHJhbmRvbWlzYXRpb24KZGF0ICU+JSBncm91cF9ieShST0JfcmFuZG9taXNhdGlvbikgJT4lIAogIHN1bW1hcmlzZShuID0gbl9kaXN0aW5jdChTdHVkeV9JRCkpCgoxNS8zMAoKI2JsaW5kaW5nCmRhdCAlPiUgZ3JvdXBfYnkoUk9CX2JsaW5kaW5nKSAlPiUgCiAgc3VtbWFyaXNlKG4gPSBuX2Rpc3RpbmN0KFN0dWR5X0lEKSkKCjYvMzAKCmBgYAo=